1.求输出结果(知识点:类初始化的过程)
public class Demo {
public static void main(String[] args) {
new Z();
}
static class X {
Y b = new Y();//这是成员变量初始化
X() {
System.out.print("X");
}
}
static class Y {
Y() {
System.out.print("Y");
}
}
public static class Z extends X {
Y y = new Y();//Y
Z() {
System.out.print("Z");//Z
}
}
}
易错答案1:XZ. 因为没考虑到属性的加载
易错答案2:YYXZ. 因为没考虑到super其实仅仅时代表了初始化父类数据
结果:YXYZ
问题:
虽然子类中构造方法默认有一个super(),(初始化)的时候,(不是)按照那个顺序进行的。(而是)按照(分层)初始化进行的。它仅仅表示)要先初始化父类数据,再初始化子类数据。
属性的加载在构造函数之前
一个类初始化的过程
父类静态代码块/静态变量 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
子类静态代码块/静态变量 ( java虚拟机加载类时,就会执行该块代码,故只执行一次)
父类属性对象初始化
父类普通代码块(每次new,每次执行 )
父类构造函数(每次new,每次执行)
子 类 属性对象初始化
子类普通代码块(每次new,每次执行 )
子类构造函数(每次new,每次执行)
说明:静态代码块与静态变量的执行顺序同代码定义的顺序;非静态变量与代码块的执行顺序同代码执行顺序
参考
本文地址:https://blog.csdn.net/weixin_43372836/article/details/107271394
希望与广大网友互动??
点此进行留言吧!