类的初始化顺序
作者:
行动的侏儒 | 来源:发表于
2018-06-09 16:25 被阅读0次public class InitTest {
public static void main(String[] args) {
Shape shape = new Ellipse();
}
}
class Shape {
int size = 5;
Shape() {
System.out.println(size);//①
print();//②
}
public void print() {
System.out.println(size);
}
}
class Ellipse extends Shape{
int size = 6;
static {
System.out.println("I am static method.");//③
}
Ellipse() {
print();//④
}
public void print() {
System.out.println(size);
}
}
/*
打印结果是:
③:I am static method.
①:5
②:0
④:6
*/
- 结果分析
最先打印③的原因是初始化一个对象时,第一步就会调用静态方法和执行静态块。
①和④打印5和6说明普通域的初始化在构造方法之前执行。
②打印0的原因是print()方法已经被子类重写,但这个时候子类的size还没初始化,说明父类对象的初始化在子类域初始化之前执行。
- 结论
初始化一个对象调用构造器的顺序:
- 将对象的所有成员变量赋值为0或者Null,JVM会在这个阶段为静态变量赋值和执行静态块。
- 对基类的成员变量赋值
- 调用基类的构造器(循环1-2步骤,直到基类为Object)。
- 按照声明顺序对成员变量进行赋值。
- 调用自身构造器。
本文标题:类的初始化顺序
本文链接:https://www.haomeiwen.com/subject/rawteftx.html
网友评论