我对以下代码的输出感到困惑。我知道第一个静态块在类加载后执行,但为什么我的类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");
}
}
答案 0 :(得分:9)
Test6.FOO
是指Test6
,但该字段是从编译时常量初始化的public static final String
,因此它will be inlined by the compiler和Test6
不会需要加载。
答案 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是静态的,这意味着它可以在类初始化之前和类加载之后使用。