唐祖庭 2021-10-13 20:55 采纳率: 94.6%
浏览 12
已结题

java读程序,然后分析过程和结果,提供必要的文字说明

读程序,然后分析过程和结果,提供必要的文字说明

public class Test {
    public static void main(String[] args) {
        Sub sub = new Sub();
    }
}
class Base{
    static {
        System.out.println("base 静态代码块");
    }
    {
        System.out.println("base 构造代码块");
    }
    public Base(){
        System.out.println("base无参构造");
    }
}
class Sub extends Base{
    static {
        System.out.println("sub 静态代码块");
    }
    {
        System.out.println("sub 构造代码块");
    }
    public Sub(){
        //super()
        System.out.println("sub 无参构造");
    }
}

  • 写回答

1条回答 默认 最新

  • 宇智波波奶茶 2021-10-14 08:51
    关注

    1、首先要知道静态代码块执行顺序高于构造代码块高于构造函数
    2、子类的构造方法中默认有 super()

    首先,JVM调用了main方法,mian方法进栈,此时遇到Sub sub = new Sub()这句语句,会将Base.class和Sub.class分别加载进内存,之后才会创建对象。我们知道,静态代码块的执行优先于对象的创建,也就是说当Base.class加载进内存时,父类的静态代码块会随着Base.class一起加载,然后是Sub.class加载进内存,而与此同时子类的静态代码块也会随着Sub.class一起加载进内存。接下来就是进入子类的构造方法了,然后你以为就直接打印子类的构造方法里的输出了吗,你太天真了,要知道java是分层初始化的,先初始化父类,才初始化子类(你爸爸始终还是你爸爸,得先有你爸爸才有你,这是一个道理)。然后,还有注意构造代码块优先于构造方法执行的,所以第三个输出的是父构造代码块,第四个输出的是父构造方法,而后才是子类的初始化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月22日
  • 已采纳回答 10月14日
  • 创建了问题 10月13日

悬赏问题

  • ¥15 在获取boss直聘的聊天的时候只能获取到前40条聊天数据
  • ¥20 关于URL获取的参数,无法执行二选一查询
  • ¥15 液位控制,当液位超过高限时常开触点59闭合,直到液位低于低限时,断开
  • ¥15 marlin编译错误,如何解决?
  • ¥15 有偿四位数,节约算法和扫描算法
  • ¥15 VUE项目怎么运行,系统打不开
  • ¥50 pointpillars等目标检测算法怎么融合注意力机制
  • ¥20 Vs code Mac系统 PHP Debug调试环境配置
  • ¥60 大一项目课,微信小程序
  • ¥15 求视频摘要youtube和ovp数据集