java面向对象易错题(持续收集中)
程序员文章站
2022-04-19 09:08:47
java面向对象易错题...
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/qq_32059827/article/details/51327007
java类的初始化顺序:https://blog.csdn.net/shenzixincaiji/article/details/82792419
本文地址:https://blog.csdn.net/weixin_43372836/article/details/107271394
推荐阅读