关于“如何做到在一个类内不通过创建另一个类的对象,却调用另一个类的方法”的问题

   通常,我们在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 问题解决! 再运行,结果如下:

关于“如何做到在一个类内不通过创建另一个类的对象,却调用另一个类的方法”的问题