在具有私有构造函数的类中初始化静态变量

时间:2013-07-27 15:55:00

标签: java static jvm

假设以下课程

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);
  }
}

在这种情况下,numinstance是否已初始化,何时在JVM中加载了A类?我知道JVM在初始化时会加载一个类,如果我错了,请纠正我。由于A类具有私有构造函数,因此无法在外部进行初始化。

提前致谢。

7 个答案:

答案 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";
  }
}