为什么我的班级没有加载

时间:2016-05-19 09:46:53

标签: java class classloader

我对以下代码的输出感到困惑。我知道第一个静态块在类加载后执行,但为什么我的类Test6没有被加载。有人可以澄清一下。

package com.vikash.General;

public class Test5 {

    public static void main(String[] args) {
        System.out.println(Test6.FOO);
    }
    static {
        System.out.println("Initializing B");
    }
}
class Test6{

    public static final String FOO = "foo";
    static {
        System.out.println("Initializing A");
    }
}

4 个答案:

答案 0 :(得分:9)

Test6.FOO是指Test6,但该字段是从编译时常量初始化的public static final String,因此它will be inlined by the compilerTest6不会需要加载。

答案 1 :(得分:2)

这似乎是因为编译器正在内联对字符串文字"foo"的引用,因此JRE实际上并不打算加载Test6来获取它。

如果您进行了更改,例如:

public static final String FOO = new String("foo");

然后类Test6确实被加载(并且它的static块被执行了。)

答案 2 :(得分:0)

使用类加载器,您将获得所需的输出

Class.forName("<package>.Test6");

答案 3 :(得分:-3)

Test6根本没有初始化。

foo是静态的,这意味着它可以在类初始化之前和类加载之后使用。