Java 初始化顺序

来源:blog.csdn.net 更新时间:2023-05-25 21:55

首先,我们先看一个例子:

class Parent {
 
    static {
        System.out.println("parent_static_{}");
    }
 
    public String a = getStrParent();
    {
        System.out.println("parent_{}");
    }
 
    public Parent() {
        System.out.println("parent_construct");
    }
 
    public String getStrParent() {
        System.out.println("parent_method");
        return "Parent";
    }
 
}
 
class Child extends Parent {
 
    {
        System.out.println("child_{}");
    }
    static {
        System.out.println("child_static_{}");
    }
    String a = getStrChild();
 
    public Child() {
        System.out.println("Child_construct");
    }
 
    public String getStrChild() {
        System.out.println("child_method");
        return "Child";
    }
}
 
public class MainClass {
    int a;
    {
        System.out.println("Mainclass_{}");
    }
    static {
        System.out.println("Mainclass_static_{}");
    }
 
    public MainClass() {
        System.out.println("MainClass_construct");
    }
 
    public static void main(String[] args) {
        Parent parent = new Child();
 
    }
 
}
运行结果:
Mainclass_static_{}
parent_static_{}
child_static_{}
parent_method
parent_{}
parent_construct
child_{}
child_method
Child_construct

说明首先是包含

    public static void main(String[] args)
函数的类中的静态块的初始化,然后是这个函数中的变量进行初始化。这里的Child 类继承Parent类,初始化的顺序是:父类的静态块-》子类的静态块-》父类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》父类的构造函数-》子类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》子类的构造函数
如果类中含有静态变量,那顺序又如何?这里,让我们再看一个例子

class Parent {
 
    static {
        System.out.println("parent_static_{}");
    }
 
    public String a = getStrParent();
    {
        System.out.println("parent_{}");
    }
 
    public Parent() {
        System.out.println("parent_construct");
    }
 
    public static String getStrParent() {//
        System.out.println("parent_method");
        return "Parent";
    }
 
}
 
class Child extends Parent {
 
    {
        System.out.println("child_{}");
    }
    static {
        System.out.println("child_static_{}");
    }
    static String a = getStrChild();//定义了一个静态变量,并用函数给它初始化;
 
    public Child() {
        System.out.println("Child_construct");
    }
 
    public static String getStrChild() {//
        System.out.println("child_static_method");
        return "Child";
    }
}
 
public class MainClass {
    int a;
    {
        System.out.println("Mainclass_{}");
    }
    static {
        System.out.println("Mainclass_static_{}");
    }
 
    public MainClass() {
        System.out.println("MainClass_construct");
    }
 
    public static void main(String[] args) {
        Parent parent = new Child();
 
    }
 
}

运行结果:
Mainclass_static_{}
parent_static_{}
child_static_{}
child_static_method
parent_method
parent_{}
parent_construct
child_{}
Child_construct

以上的运行结果中:child_static_method是由于定义了静态变量而又调用了函数给它初始化输出的。说明静态的变量的初始化和静态的块应该是一个优先级的。

综上,Java 初始化顺序如下:

首先是包含

    public static void main(String[] args)
函数的类中的静态块的初始化,然后是这个函数中的变量进行初始化。这里的Child 类继承Parent类,初始化的顺序是:父类的静态块或静态变量(这两种的等级相同,根据代码的先后顺序而定)-》子类的静态块或静态变量(这两种的等级相同,根据代码的先后顺序而定)-》父类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》父类的构造函数-》子类的非静态块或非静态变量(这两种的等级相同,根据代码的先后顺序而定)-》子类的构造函数