0

假设以下类

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 有一个私有构造函数,它不能在外部初始化。

提前致谢。

4

7 回答 7

1

它在加载类时执行。每当构造一个类或访问其静态变量/方法时,就会加载一个类。

于 2013-07-27T15:58:48.593 回答
1

你是对的,当加载类时,静态块和静态变量被初始化,因为它们属于类。

于 2013-07-27T15:59:42.923 回答
1

对象A.instance在代码中使用的第一个引用A处初始化,当发现​​它作为要加载的另一个类的依赖项时初始化类

于 2013-07-27T15:59:50.327 回答
1

事实上,当你使用A.num它时,它根本不会初始化,因为编译器替换了常量,并且到处A.num使用,编译器7代替。

您可以反编译已编译的类以查看此内容。

但是在被类加载器加载A.instance时被初始化。A

于 2013-07-27T16:01:53.663 回答
1

因为 num 和 instance 是类的静态数据。静态意味着某些东西在类的所有实例之间共享。当你的类被加载到 JVM 中时,所有的静态数据都会被加载。您无需等待实例创建即可访问​​静态数据。所以在你的情况下,只要你运行类 num 和实例就会在运行时加载到 JVM 中。

问候

于 2013-07-27T16:06:17.303 回答
1

执行此操作的标准 Java 类的一个示例是java.lang.Math

由于它是一个实用程序类,不打算实例化,构造函数是私有的,但它包含 E、PI 等的常量......

于 2013-07-27T16:17:38.467 回答
1

变量在类加载器首次加载时初始化,这通常是在您首次静态使用类或通过实例化某些对象时。导入不算使用类。编译器会忽略它们,直到您实际对该类执行某些操作。

您可以使用类中的静态初始化程序块自定义初始化。这非常像构造函数,除了它在类加载时和第一次构造函数调用之前执行。

class Foo {
  public static final String FOO;

  {
    FOO="helloworld";
  }
}
于 2013-09-10T09:22:41.953 回答