构造问题

先记录,再分析


class HelloB extends HelloA {

    public HelloB(String a) {
        System.out.println("Constructor B");
    }

    static {
        System.out.println("static B");
    }

    {
        System.out.println("block B class");
    }

    public static void main(String[] args) throws ClassNotFoundException {
        new HelloB("B");
        System.out.println("-----------");
        new HelloB("B");
        //Class.forName(HelloA.class.getName());
        //Class.forName(HelloA.class.getName(), false, HelloB.class.getClassLoader());
    }
}

class HelloA {

    public HelloA() {
        System.out.println("Constructor A");
    }

    static {
        System.out.println("static A");
    }

    {
        System.out.println("block A class ");
    }
}

输出结果

static A
static B
block A class 
Constructor A
block B class
Constructor B
-----------
block A class 
Constructor A
block B class
Constructor B

结论: 按 静态块 -> 普通块 -> 构造方法 的顺序执行

类加载的情况:

  1. 实例化
  2. 访问其静态变量或对静态变量赋值
  3. 调用静态方法
  4. 反射class.forName("");forName有(string,boolean,classLoader) 方法,指定boolean init=false时不会初始化、
  5. 初始化一个类的子类、
  6. 虚拟机启动被标注为启动的类(Main方法)
posted @ 2020-08-24 16:34  BigOrang  阅读(102)  评论(0编辑  收藏  举报