關於“如何做到在一個類內不通過創建另一個類的對象,卻調用另一個類的方法”的問題


   通常,我們在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 問題解決! 再運行,結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM