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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© anuo 中级黑马   /  2015-11-30 21:34  /  765 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 ,
请高手指教一下,我哪块错了

2 个回复

倒序浏览
marcojam 来自手机 中级黑马 2015-12-1 00:15:57
沙发
因为在创建第二个对象走带参构造,每个构造方法里的第一行其实默认有一条super()语句
回复 使用道具 举报 1 0
初始化子类,调用子类有参的时候默认情况下也是先去调用父类的无参构造,除非你在子类的构造方法中使用super来指明调用父类中的哪个构造方法。
这个程序的运行步骤是这样的:第一 步,因为你创建的对象没有给参数,所以默认的是走空参构造,但是他有父类,所以他会先访问父类空参构造,看父类空参构造初始化需要哪些指令运行,到了父类空参构造发现,父类需要调用func()方法才能完成构造初始化,我们子类自己重写了自己的func()方法,根据动态绑定的原理,我们运行自己的func()方法,第一次打印出4:第二步,我们创建了一个对象并且传递了一个参数3,这是默认的是走有参构造,我们计算机看到子类有有参构造,但是他不知道我们的父类是否有没有有参构造,所以他需要到父类去看看,有的话就走父类有参构造完成初始化,去了发现没有有参构造,但是有无参构造,既然来了,那么顺道把他初始化一下,因为我们不知道在初始化之前父类的值是否被改变过,就像一个U盘别人刚杀过毒,你不知道,你现在要用那么你也会在自己用之前杀个毒,在初始化父类空参时,发现他要完成func()方法,所以我们又跑到自己的类运行自己的func(),于是又打印了一遍4;第三步,打印完成后,我们才回来走自己的有参构造,把3打印出来!希望楼主能明白!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马