断点调试来分析一道笔试题:
先说正确的输出的结果:
相信小伙伴会有疑惑:为啥先有个A?
打上断点,且跟随本憨憨断点调试看看究竟...
第一步:进入DEBUG模式
第二步:下一步竟然进入到了class A 的方法A中(这就是疑处所在!!!)
执行后的控制台:
接下来继续看
第三步:执行到B的无参构造
执行后的控制台:
第四步:这一行代码走完了,回到该行
第五步:开始执行下一行,走你:
第六步:直接走A的空参构造
执行后的控制台:
程序结束!
开始分析:
1.构造函数不能继承,只能调用(正确理解概念);
2.如果父类没有无参构造函数,创建子类时,必须在构造函数第一行中调用父类有参构造函数。(否则编译器会报错)
Alt + enter 可以看看编译器给出的报错解决方案:
而父类没有无参构造函数super(),所以编译就无法通过了。如果父类有无参构造函数,只要在子类构造函数第一行调用super()即父类无参构造函数,就可以了。
如下:
如果父类没有空参构造
再次强调一下:
那么,上面的那个题目就好理解了,父类只有无参构造函数,子类没有主动调用父类的无参构造,JDK默认会调用父类的有参构造,即new B();就会先走父类的无参构造public A()方法,再回来走子类B自己的无参构造public B()方法;如此这一行代码执行后便有了A、B两行打印.
原文:https://www.cnblogs.com/debuggerhu/p/13397440.html