zoukankan      html  css  js  c++  java
  • 一道无参构造笔试题引发的思考

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

    先说正确的输出的结果:

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

  • 相关阅读:
    Scrum Meeting Alpha
    Scrum Meeting Alpha
    Scrum Meeting Alpha
    你连自律都做不到,还奢谈什么自由?
    改变这个世界
    这世界没有人能随随便便成功
    “沙堆实验”
    解读那些年我们见过的“富人思维”
    心存希望,面朝大海
    闻香识女人 演讲台词
  • 原文地址:https://www.cnblogs.com/debuggerhu/p/13397440.html
Copyright © 2011-2022 走看看