对象初始化调用顺序

class A{
    public int i = method();
    public static int j= method2();
    public int k = 0;

    public A(){
        System.out.println(1);
    }
    public int method(){
        System.out.println(2);
        return 2;
    }
    public static int method2(){
        System.out.println(3);
        return 3;
    }
}
public class B extends A{
    public int m = method3();
    public static int n = method4();
    static {
        System.out.println("B()");
    }
    public int t = 0;

    public B(){
        System.out.println(4);
    }
    public int method3(){
        System.out.println(5);
        return 5;
    }
    public static int method4(){
        System.out.println(6);
        return 6;
    }
    public static int x = method5();
    public static void main(String[] args){
        System.out.println(7);
        A a = new B();
    }
    private static int method5() {
        System.out.println("0");
        return 0;
    }
}
  • 执行public class B extends A(需要有main方法)的时候会先调用B的父类A中的静态部分(静态变量和静态代码块),但是并不会调用A的成员变量和构造函数,然后会调用B中的静态部分,但也不会调用B的成员变量和构造函数;
  • new B();则会同时调用A和B中的静态变量和成员变量和构造函数;
  • 类的静态部分是先于成员变量和构造方法调用的,无论静态部分在什么位置,都会先于非静态部分进行调用,但是静态部分自身的调用顺序是有先后的,会按照代码的先后顺序进行调用;

你可能感兴趣的:(对象初始化调用顺序)