<span style="font-size:32px;">子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?
正确答案: C
A父类B静态代码块->父类B构造函数->子类A静态代码块->父类B非静态代码块-></span>
<span style="font-size:32px;">子类A构造函数->子类A非静态代码块
B父类B静态代码块->父类B构造函数->父类B非静态代码块->子类A静态代码块-></span>
<span style="font-size:32px;">子类A构造函数->子类A非静态代码块
C父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数-></span>
<span style="font-size:32px;">子类A非静态代码块->子类A构造函数
D父类B构造函数->父类B静态代码块->父类B非静态代码块->子类A静态代码块-></span>
<span style="font-size:32px;">子类A构造函数->子类A非静态代码块</span>
这种题,你不能不懂JVM实例化对象的过程,
我们就把这个过程列出来:
1首先需要虚拟机加载出.class文件,并加载进内存,并会加载该实例的父类(如果该实例有父类,我们为了好讲解,下面都当有父类的情况)
2在堆内存开辟空间,分配地址
3然后是对象中的属性进行初始化
4对应的构造函数进行初始化
5在构造函数中,首先对父类进行初始化
6父类初始化完成后才会对子类属性进行初始化
7子类构造函数进行初始化
8初始化完成后,将地址值赋给引用变量。