类的实例化顺序

通过简单的代码,更清晰的了解了,一个类的实例化顺序

/**
 * 测试实例化父类
 */
public class ParentInstance {
    
    public ParentInstance() {
        System.out.println("父类构造方法");
        this.print();
    }
    
    {
        System.out.println("父类构造代码块");
    }
    
    static {
        System.out.println("父类静态代码块");
    }

    public void print() {
        System.out.println("父类打印方法");
    }
    
}
/**
 * 测试实例化子类
 */
public class SonInstance extends ParentInstance {
    
    public SonInstance() {
        System.out.println("子类构造方法");
        this.print();
    }
    
    {
        System.out.println("子类构造代码块");
    }
    
    static {
        System.out.println("子类静态代码块");
    }

    public void print() {
        System.out.println("子类打印方法");
    }
    
    public static void main(String[] args) {
        System.out.println("子类main()方法");
        new SonInstance();
    }
    
}

结果如下:

父类静态代码块
子类静态代码块
子类main()方法
父类构造代码块
父类构造方法
子类打印方法
子类构造代码块
子类构造方法
子类打印方法

由于父类打印方法被子类覆盖,因此尽管父类调用的是this.print(),但最终还是调用子类的打印方法。

总结如下:

父类静态代码块>子类静态代码块>子类main()方法>父类构造代码块>父类构造方法>子类构造代码块>子类构造方法

静态代码块:在虚拟机加载类的时候就会加载执行,而且只执行一次。

非静态代码块:在创建对象的时候执行,每次创建对象都会执行一次。

原文地址:https://www.cnblogs.com/feiyang930112/p/10618083.html