A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨翔 中级黑马   /  2013-1-9 01:05  /  1139 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨翔 于 2013-1-15 22:24 编辑

这个算是个疑问吧,我有点转不过弯来,是视频中异常练习的一小部分,在
Teacher类中构造函数初始化的时候new了hp作为Computer的对象,问题不在这边
,问题是主函数中,我new了Teacher对象的时候,hp这个对象就产生了,当我再
次new一个Teacher对象时,堆内存中会再次new一个hp这个对象?到这边有点想
不明白了,如果我想初始化老师的时候初始化不同的电脑该怎么做呢?
  1. class Computer
  2. {
  3.    public void run()
  4.    {
  5.       System.out.print("computer run");        
  6.    }
  7.            
  8. }
  9. class Teacher
  10. {
  11.    private String name;
  12.    private Computer hp;
  13.    Teacher(String name)
  14.    {
  15.       this.name = name;
  16.       hp = new Computer();         
  17.    }
  18. }
  19. class ExceptionTest
  20. {
  21. public static void main(String[] args)
  22.    {
  23.       Teacher i = new Teacher("laoshi");
  24.    }        
  25.         
  26. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 修心者 于 2013-1-9 01:35 编辑

当你第一次创建Teacher对象时,
会在栈空间创建一个引用变量指向在堆空间中的Teacher对象.
在Teacher对象中也有一个引用变量,它指向的是Computer对象。
第二次创建Teacher对象,它也会按照这样步骤走一遍。
你可以做这样的实验:
class Computer {
        Computer() {
                System.out.println("computer...");
        }
}
class Teacher {
        private String name;
        private Computer hp;
        Teacher(String name) {
                this.name = name;
                hp = new Computer();
        }
}
class ExceptionTest {
        public static void main(String[] args) {
                Teacher t1 = new Teacher("laoshi");
                Teacher t2 = new Teacher("laoshi");
        }
}
打印结果:
computer...
computer...
说明Computer被new了两次。即有了两个Computer对象。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
这个和寄存器的工作原理挂钩  看代码你解决不了问题  
回复 使用道具 举报
这个你可以在写个老师的构造函数Teacher(String name,Computer computer){....},同时电脑那里的构造函数要有多个,否则,电脑还是一样的,没什么变化
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马