首页 > 其他 > 详细

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

时间:2020-07-29 18:10:12      阅读:77      评论:0      收藏:0      [点我收藏+]

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

技术分享图片

先说正确的输出的结果:

技术分享图片

相信小伙伴会有疑惑:为啥先有个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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!