黑马程序员技术交流社区

标题: java构造器问题 [打印本页]

作者: anuo    时间: 2015-11-30 21:34
标题: java构造器问题
class Teacher extends Person {
public Teacher() {
  super();
}
public Teacher(int a) {
  System.out.println(a);
}
public void func() {
  System.out.print("4, ");
}
public static void main(String[] args) {
  Teacher t1 = new Teacher();
  Teacher t2 = new Teacher(3);
}
}
class Person {
public Person() {
  func();
}
public void func() {
  System.out.println("1, ");
}
}

上面的代码,为啥结果是4,4,3,而不是4,3
我怎么考虑,都是4,3 ,
请高手指教一下,我哪块错了
作者: marcojam    时间: 2015-12-1 00:15
因为在创建第二个对象走带参构造,每个构造方法里的第一行其实默认有一条super()语句
作者: jiangshicun007    时间: 2015-12-1 09:51
初始化子类,调用子类有参的时候默认情况下也是先去调用父类的无参构造,除非你在子类的构造方法中使用super来指明调用父类中的哪个构造方法。
这个程序的运行步骤是这样的:第一 步,因为你创建的对象没有给参数,所以默认的是走空参构造,但是他有父类,所以他会先访问父类空参构造,看父类空参构造初始化需要哪些指令运行,到了父类空参构造发现,父类需要调用func()方法才能完成构造初始化,我们子类自己重写了自己的func()方法,根据动态绑定的原理,我们运行自己的func()方法,第一次打印出4:第二步,我们创建了一个对象并且传递了一个参数3,这是默认的是走有参构造,我们计算机看到子类有有参构造,但是他不知道我们的父类是否有没有有参构造,所以他需要到父类去看看,有的话就走父类有参构造完成初始化,去了发现没有有参构造,但是有无参构造,既然来了,那么顺道把他初始化一下,因为我们不知道在初始化之前父类的值是否被改变过,就像一个U盘别人刚杀过毒,你不知道,你现在要用那么你也会在自己用之前杀个毒,在初始化父类空参时,发现他要完成func()方法,所以我们又跑到自己的类运行自己的func(),于是又打印了一遍4;第三步,打印完成后,我们才回来走自己的有参构造,把3打印出来!希望楼主能明白!




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