Java 类中各成员的加载顺序

public class SuperAndSub {
    public static void main(String[] args) {
        Sub s3 = new Sub();
    }
}

class Super {
    static int a = getA();

    static {
        System.out.println("加载Super的静态块");
    }

    int b = getB();

    {
        System.out.println("加载Super的普通块");
    }

    Super() {
        System.out.println("加载Super的构造器");
    }

    static int getA() {
        System.out.println("加载Super的静态变量");
        return 1;
    }

    static int getB() {
        System.out.println("加载Super的实例变量");
        return 2;
    }
}

class Sub extends Super {
    static int c = getC();

    static {
        System.out.println("加载Sub的静态块");
    }

    int d = getD();

    {
        System.out.println("加载Sub的普通块");
    }

    Sub() {
        System.out.println("加载Sub的构造器");
    }

    static int getC() {
        System.out.println("加载Sub的静态变量");
        return 1;
    }

    static int getD() {
        System.out.println("加载Sub的实例变量");
        return 2;
    }
}

运行结果:
加载Super的静态变量
加载Super的静态块
加载Sub的静态变量
加载Sub的静态块
加载Super的实例变量
加载Super的普通块
加载Super的构造器
加载Sub的实例变量
加载Sub的普通块
加载Sub的构造器

结果分析

  1. 首先是父类静态变量和静态块:
  2. 然后是子类的静态变量和静态块:
  3. 然后是父类的a.普通实例b.普通块儿c.构造方法
  4. 最后是子类的其它成分:a.普通实例,b.普通块儿,c.构造方法

You may also like...