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