类的初始化顺序

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还没初始化,说明父类对象的初始化在子类域初始化之前执行。
  • 结论
    初始化一个对象调用构造器的顺序:
    1. 将对象的所有成员变量赋值为0或者Null,JVM会在这个阶段为静态变量赋值和执行静态块。
    2. 对基类的成员变量赋值
    3. 调用基类的构造器(循环1-2步骤,直到基类为Object)。
    4. 按照声明顺序对成员变量进行赋值。
    5. 调用自身构造器。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容