父类跟子类初始化顺序

父类和子类初始化顺序

父类 子类 初始化顺序, 留作查看:

 

 

class Parent {
    // 静态变量
    public static String p_StaticField = "父类--静态变量";
    // 变量
    public String p_Field = "父类--变量";

    // 静态初始化块
    static {
        System.out.println(p_StaticField);
        System.out.println("父类--静态初始化块");
    }

    // 初始化块
    {
        System.out.println(p_Field);
        System.out.println("父类--初始化块");
    }

    // 构造器
    public Parent() {
        System.out.println("父类--构造器");
    }
}

public class SubClass extends Parent {
    // 静态变量
    public static String s_StaticField = "子类--静态变量";
    // 变量
    public String s_Field = "子类--变量";
    // 静态初始化块
    static {
        System.out.println(s_StaticField);
        System.out.println("子类--静态初始化块");
    }

    // 初始化块
    {
        System.out.println(s_Field);
        System.out.println("子类--初始化块");
    }

    // 构造器
    public SubClass() {
        System.out.println("子类--构造器");
    }

    // 程序入口
    public static void main(String[] args) {
        new Parent();
        System.out.println("------以上是 new 父类-------------\n");
        
        new SubClass();
        System.out.println("------以上是 new 子类-------------\n");
        
        new SubClass();
        System.out.println("------以上是 第二次 new 子类-------------");
    }
}

 


执行结果:

父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
------以上是 new 父类-------------

父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
------以上是 new 子类-------------

父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
------以上是 第二次 new 子类-------------

 

总结:

1、new父类的时候同时会一起把子类的静态全局变量和静态初始化块初始化
2、单独一个类(没有父类和子类情况)初始化顺序:

  (1)静态全局变量、静态初始化块
  (2)全局变量、全局初始化块(动态初始化块)
  (3)构造器
3、不管这个类是不是单例,一个类的静态全局变量、静态初始化块只会初始化一次
     再次new这个类的时候,静态全局变量、静态初始化块不会再次初始化
4、单独new一个子类的时候(其父类未被初始化),执行顺序为:
  (1)父类--静态全局变量、静态初始化块
  (2)子类--静态全局变量、静态初始化块
  (3)父类--全局变量、初始化块
  (4)父类--构造器
  (5)子类--全局变量、初始化块
  (6)子类--构造器

 

注:2个在一的按照代码先后顺序初始化