黑马程序员技术交流社区

标题: 有关于类的实例化的疑问 [打印本页]

作者: 杨翔    时间: 2013-1-9 01:05
标题: 有关于类的实例化的疑问
本帖最后由 杨翔 于 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. }
复制代码

作者: 罗利华    时间: 2013-1-9 01:27
本帖最后由 修心者 于 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对象。

作者: 心弦上的景致    时间: 2013-1-9 02:03
这个和寄存器的工作原理挂钩  看代码你解决不了问题  
作者: 黄锦成    时间: 2013-1-9 16:26
这个你可以在写个老师的构造函数Teacher(String name,Computer computer){....},同时电脑那里的构造函数要有多个,否则,电脑还是一样的,没什么变化




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2