一道无参构造笔试题引发的思考

断点调试来分析一道笔试题:

先说正确的输出的结果:

相信小伙伴会有疑惑:为啥先有个A?
打上断点,且跟随本憨憨断点调试看看究竟...

第一步:进入DEBUG模式

第二步:下一步竟然进入到了class A 的方法A中(这就是疑处所在!!!)

执行后的控制台:

竟然打印了A!!!!!!

接下来继续看
第三步:执行到B的无参构造


执行后的控制台:

第四步:这一行代码走完了,回到该行

第五步:开始执行下一行,走你:

第六步:直接走A的空参构造

执行后的控制台:

程序结束!

开始分析:

1.构造函数不能继承,只能调用(正确理解概念);
2.如果父类没有无参构造函数,创建子类时,必须在构造函数第一行中调用父类有参构造函数。(否则编译器会报错)
Alt + enter 可以看看编译器给出的报错解决方案:

而父类没有无参构造函数super(),所以编译就无法通过了。如果父类有无参构造函数,只要在子类构造函数第一行调用super()即父类无参构造函数,就可以了。
如下:

如果父类没有空参构造

总结:

1.当父类只有含参构造方法时,子类必须(在子类的第一行)调用父类的有参构造(不用super调用父类的含参构造的话,编译器会报错);

2.当父类同时含有有参和空参构造时:

2.1子类可以主动有且仅可任意(在子类的第一行)调用父类一个构造方法;

2.1.1子类可以(在子类的第一行)主动调用父类的含参构造

2.1.2子类也可以主动(在子类的第一行)调用父类的无参构造

2.2若子类未主动(在子类的第一行)调用父类的任意一个构造方法,系统会默认调用父类的无参构造

再次强调一下:

子类一定是在(在子类的第一行)调用父类的构造方法;

那么,上面的那个题目就好理解了,父类只有无参构造函数,子类没有主动调用父类的无参构造,JDK默认会调用父类的无参构造,即new B();就会先走父类的无参构造public A()方法,再回来走子类B自己的无参构造public B()方法;如此这一行代码执行后便有了A、B两行打印.

原文地址:https://www.cnblogs.com/debuggerhu/p/13397440.html