通常,我們在java中通過實例化一個類來調用該類的方法,但是,如果有多個類都要調用這個類地方法,是不是要在每個主調類里面都創建一個被調用類的對象呢?
如果這樣做,會不會因為多次實例化而影響程序的執行效果呢?
答案是:沒必要多次創建被調用類的對象,而且多次實例化還可能會影響程序執行效果。
解決問題的辦法是:在每一個主調類里面各寫一個構造方法,形參是被調用類的對象,
public ShopCartItem(ShopCart shopcart) { super(); this.shopcart=shopcart; }
實例化被調用類的時候,得到一個對象,在實例化主調類的時候,順便調用 帶一個被調用類對象的構造函數,如此,便把測試類里面實例化的被調用類的對象傳遞到各個主調函數,從而避免了對此實例化被調用類。如下:
ShopCartItem shopcartitem=new ShopCartItem(shopcart); // ShopCartItem shopcartitem=new ShopCartItem();
請看如下代碼:
(程序的目的是:運用HashMap,實現往購物車里添加書籍,並根據圖書名字得到該圖書的數量)
*******************購物車類(建立集合,實現添加圖書方法)************************
1 package practise05_1; 2 3 import java.util.*; 4 5 public class ShopCart { 6 Map map=new HashMap(); 7 public void add(Book book){//book是形似參數,只要保證傳值時傳的是對象即可,對象名隨意 8 map.put(book.getName(), book); //形式參數,要與book同名 9 } 10 }
*****************圖書類**********************
1 package practise05_1; 2 3 public class Book { 4 private int number; 5 private double price; 6 private String name; 7 public Book(int number, double price, String name) { 8 super(); 9 this.number = number; 10 this.price = price; 11 this.name = name; 12 } 13 public Book(int number, double price) { 14 super(); 15 this.number = number; 16 this.price = price; 17 } 18 public Book() { 19 super(); 20 } 21 public String getName() { 22 return name; 23 } 24 public void setName(String name) { 25 this.name = name; 26 } 27 public int getNumber() { 28 return number; 29 } 30 public void setNumber(int number) { 31 this.number = number; 32 } 33 public double getPrice() { 34 return price; 35 } 36 public void setPrice(double price) { 37 this.price = price; 38 } 39 }
********************輔助類(實現返回數量方法)************************
1 package practise05_1; 2 3 import java.util.*; 4 import java.util.Scanner; 5 6 public class ShopCartItem { 7 Scanner sc =new Scanner(System.in); 8 ShopCart shopcart = new ShopCart(); 9 // 得到數量 10 public void getBookNumber(){ 11 System.out.println("請從OOP、JAVA、C++、SQL中選擇輸入書籍的名稱:"); 12 String str=sc.next(); 13 Book book=(Book) shopcart.map.get(str); 14 if(shopcart.map.containsKey(str)){ 15 System.out.println("當前的數量是:"+book.getNumber()); 16 } 17 else{ 18 System.out.println("您的購物車中沒有這本書!"); 19 } 20 } 21 }
*******************測試類***********************
1 package practise05_1; 2 3 public class HashMapTest { 4 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) { 9 ShopCart shopcart=new ShopCart(); 10 shopcart.add(new Book(132,98,"OOP")); 11 shopcart.add(new Book(12,12.5,"JAVA")); 12 shopcart.add(new Book(22,45,"JSP")); 13 shopcart.add(new Book(132,98,"OOP")); 14 shopcart.add(new Book(42,18,"C++")); 15 // ShopCartItem shopcartitem=new ShopCartItem(shopcart); 16 ShopCartItem shopcartitem=new ShopCartItem(); 17 shopcartitem.getBookNumber(); 18 } 19 }
運行結果如下:
會發現明明集合里面有OOP這本書,查詢的結果卻是控制。為何?原因在於輔助測試類里面 第9行 已經實例化了一次購物車類,而輔助類里面又實例化了一次購物車類,這在一般情況下是可以的。但是,特殊之處在於:我們在購物車類里面建立了集合對象,雖然實例化購物車對象的時候,沒有顯式的指向執行這句話,但是實際上在實例化時,建立集合這段代碼也被執行了,相當於這段代碼
1 Map map=new HashMap();
被寫在了購物車類的構造方法里面,每次實例化該類時都會重新建立一個集合,所以從新建立的集合中取到的值為空。
那么。如何修改呢?
如下:
輔助類里面第9行紅色代碼改為下面代碼:
1 ShopCart shopcart = null; 2 public ShopCartItem(ShopCart shopcart) { 3 super(); 4 this.shopcart=shopcart; 5 }
測試類里面第16行紅色代碼換成第15行紫色代碼,OK 問題解決! 再運行,結果如下: