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

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

时间: 2024-10-14 00:45:32

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

类内const static(static const)成员变量初始化问题

在查找const相关资料的过程中,又遇到了另外一个问题,就是C++类中const static(或者static const)成员变量应当如何初始化的问题. 查阅了许多资料,发现VC环境下,只允许const static成员变量在类外初始化,这个应该是编译器遗留下的bug(你也可以说是要求严格). 在其他编译器下,整型以及枚举类型的const static成员变量是允许在声明的同时进行初始的,其中整型包括int.short.long.char等,非整型是指浮点型 包括float.double等.

重构笔记——将类内联化

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/43159817         在上一篇文章中介绍了"提炼类".本文将介绍"将类内联化"这种重构手法.         下面让我们来学习这种重构手法吧. 开门见山         发现:某个类并没有做太多的事情. 解决:将这个类的所有特性搬移到另一个类中,然后移除原类. 动机 "将类内联化"正好与"

类内定义线程的回调函数问题

C++类成员函数使用时,都会隐式传递一个this指针给该函数,this指针指向该类的对象.函数体可以通过显示调用该指针或直接访问类内成员.      回调函数是用指针来调用的函数,最常使用的回调函数就是在创建线程时,以一个函数指针以及传递给这个函数多个参数来调用线程函数来创建线程.那么一般的类成员函数是不能用作回调函数的,因为库函数在使用回调函数时,都会传递指定的符合回调函数声明的的参数给回调函数,而类成员函数隐式包含一个this指针参数,所以把类成员函数当作回调函数编译时因为参数不匹配会出错.

静态成员不能在类内初始化

为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样. class A { private: static int count ; // 类内声明 }; int A::count = 0 ; // 类外初始化,不必再加static关键字 为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的. #include <iostream> #include <cst

如何判断一个点是否在一个多边形内?

提示:对多边形进行分割,成为一个个三角形,判断点是否在三角形内. 一个非常有用的解析几何结论:如果P2(x1,y1),P2(x2,y2), P3(x3,y3)是平面上的3个点,那么三角形P1P2P3的面积等于下面绝对值的二分之一: | x1  y1  1 | | x2 y2  1 | = x1y2 + x3y1 + x2y3 –x3y2 – x2y1 – x1y3 | x3 y3  1 | 当且仅当点P3位于直线P1P2(有向直线P1->P2)的右侧时,该表达式的符号为正.这个公式可以在固定的时

《Effective C++》:条款43:学习处理模板化基类内的名称

[toc] 模板化的类作为基类时,有哪些要注意的地方.以一个例子说明,假设现在编写一个发送信息到不同公司的程序,信息要么译成密码,要么就是原始文字,在编译期间来决定哪一家公司发送至哪一家公司,采用template手法: class CompanyA{ public: void sendCleartext(const std::string& msg); void sendEncryted(const std::string& msg); -- }; class CompanyB{ publ

python类内init外声明的属性与init内声明的对象属性的访问和操作区别

python类内init外声明的属性与init内声明的对象属性的访问和操作区别(面试题) 1.在ipython中输入以下代码,其输出会是什么? In [1]: class ClassOut: ...: out_mem = 'out_mem' ...: print out_mem ...: def __init__(self): ...: inner_mem = 'inner_mem' ...: self.inner_mem = 'self.inner_mem' ...: self._inner_

C++ 静态成员的类内初始化

一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了. 我们来看如下代码: 1 //example.h 2 #include<iostream> 3 #include<vector> 4 using namespace std; 5 6 class Example{ 7 public: 8 static double rate = 6.5; 9 static const int vecSize =

错误: ISO C++ 不允许在类内初始化非常量静态成员

错误: ISO C++ 不允许在类内初始化非常量静态成员 今天开始学C++ primer,在牵扯到Sales_item.h头文件时,出现了一些问题(和C++11新特性相关),当前的编译器版本是gcc/g++ 4.6.3,所以需要升级.可以利用PPA升级到4.8.1,如下: sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update; sudo apt-get install gcc-4.8 g++-4.8 sud