Java类的初始化执行顺序

文章目录

  • Java类的初始化执行顺序
  • 1. 无继承关系的类
  • 2.有继承关系的类
  • 3. 总结

Java类的初始化执行顺序

1. 无继承关系的类

静态变量→静态代码块→非静态变量→非静态代码块→构造方法

public class Base {

    static int i = 0;
    int j = 0;

    {
        i++;
        j++;
        System.out.println("代码块i="+i+"\t实例代码块j="+j);
    }

    static {
        System.out.println("静态代码块设置前i="+i);
        i++;
        System.out.println("静态代码块设置后i="+i);
    }



    public Base() {
        i++;
        j++;
        System.out.println("构造器中i="+i+"\t实例代码块j="+j);
    }

    public static void main(String[] args) {
        new Base();
    }
}

执行结果:

静态代码块设置前i=0
静态代码块设置后i=1
代码块i=2	实例代码块j=1
构造器中i=3	实例代码块j=2

2.有继承关系的类

父类静态变量→父类静态代码块→子类静态变量→子类静态代码块→父类非静态变量→父类非静态代码块→父类构造方法→子类非静态变量→子类非静态代码块→子类构造方法

Father类:

public class Father {
    static int i=0;

    static {
        i++;
        System.out.println("Father静态代码块i="+i);
    }

    {
        i++;
        System.out.println("Father代码块i="+i);
    }

    public Father() {
        System.out.println("Father构造器i="+i);
    }
}

Son类:

public class Son extends Father{

    static int i=0;

    static {
        i++;
        System.out.println("Son静态代码块i="+i);
    }

    {
        i++;
        System.out.println("Son代码块i="+i);
    }

    public Son() {
        System.out.println("Son构造器i="+i+"\tFather的变量i="+Father.i);
    }

    public static void main(String[] args) {
        Father father = new Son();
    }

}

执行结果:

Father静态代码块i=1
Son静态代码块i=1
Father代码块i=2
Father构造器i=2
Son代码块i=2
Son构造器i=2	Father的变量i=2

3. 总结

  1. 静态变量和静态代码块初始化是平级的,按照从上往下的顺序执行
  2. 静态变量(代码块)比非静态变量(代码块)先初始化
  3. 静态变量(代码块)只初始化一次,非静态变量(代码块)可以初始化多次
  4. 父类比子类先初始化

你可能感兴趣的:(java,java)