zoukankan      html  css  js  c++  java
  • 关于“如何做到在一个类内不通过创建另一个类的对象,却调用另一个类的方法”的问题

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

  • 相关阅读:
    Nodejs与ES6系列3:generator对象
    Nodejs与ES6系列2:Promise对象
    Nodejs与ES6系列1:变量声明
    Nodejs与ES6系列4:ES6中的类
    angular单元测试与自动化UI测试实践
    javascript 异步模块加载 简易实现
    javascript模式 (3)——工厂模式和装饰模式
    TP手册学习第四内置天
    TP手册学习第三天
    tp5命令行基础
  • 原文地址:https://www.cnblogs.com/yangyi9343/p/4762130.html
Copyright © 2011-2022 走看看