假设以下课程
class A{
public final static int num = 7;
public final static A instance = new A();
private A(){}
}
class TestA{
public static void main(String args[]){
System.out.print(A.num);
}
}
在这种情况下,num
和instance
是否已初始化,何时在JVM中加载了A类?我知道JVM在初始化时会加载一个类,如果我错了,请纠正我。由于A类具有私有构造函数,因此无法在外部进行初始化。
提前致谢。
答案 0 :(得分:1)
在加载类时执行。无论何时构造它或者访问其静态变量/方法,都会加载一个类。
答案 1 :(得分:1)
你是对的,当加载类时,静态块和静态变量被初始化,因为它们属于类。
答案 2 :(得分:1)
对象A.instance
在代码中使用的第一个引用处初始化,类A
在被发现为要加载的另一个类的依赖项时被初始化
答案 3 :(得分:1)
事实上,当你使用A.num
时,它根本不会初始化,因为编译会替换常量,而且只要使用A.num
,编译器就会放置7
。
您可以反编译已编译的类以查看此内容。
但是A.instance
在类加载器加载A
时被初始化。
答案 4 :(得分:1)
由于num和instance是类的静态数据。静态意味着在类的所有实例之间共享某些东西。当您的类在JVM中加载时,所有静态数据都会被加载。您无需等待实例创建来访问静态数据。在你的情况下,只要你运行类num,实例就会在运行时加载到JVM中。
此致
答案 5 :(得分:1)
执行此操作的标准Java类的示例是java.lang.Math
由于它是一个实用程序类,不打算实例化,因此构造函数是私有的,但它包含E,PI等的常量......
答案 6 :(得分:1)
当类首次由类加载器加载时,变量会被初始化,这通常是在您第一次静态地使用类或通过实例化某些对象时。导入不算作使用类。编译器会忽略它们,直到您实际对该类执行某些操作。
您可以使用类中的静态初始化程序块自定义初始化。这非常类似于构造函数,除了它在加载类和第一个构造函数调用之前执行。
class Foo {
public static final String FOO;
{
FOO="helloworld";
}
}