2

关于以下代码的快速问题:

public class Test {

    public final static Test t1 = new Test("test 1");
    public final static Test t2 = new Test("test 2");
    public final static Test t3 = new Test("test 3");

    private String s;

    private Test (string s1) {
        s = s1;
    }
}

我对这段代码是否会创建自己的无限实例感到困惑?

4

5 回答 5

3

不,VM 不会:"create unlimited instances of itself."

您的静态字段(t1t2t3将在级别上创建一次(每个)Class,而不是在Instance级别上。您的 3 个字段将在所有实例之间共享。

于 2013-03-12T14:10:03.043 回答
1

由于声明与声明中的赋值相结合,代码不会创建自身的无限实例,因为变量t1是静态初始化t2的(意味着在类被加载时初始化一次,而不是每个实例一次)。t3static

您可能想了解究竟是做什么static的。

有用的说明:

另一方面,下面的示例在使用static变量时会导致它在创建实例时被初始化(因为构造函数中的赋值),因此会导致StackOverflowError

public class Test {
   static Test t1;
   Test () {
      t1 = new Test();
   }
}
于 2013-03-12T14:10:04.510 回答
1

静态成员不是创建对象的一部分。所以不会有无限的Test对象创造。

于 2013-03-12T14:10:46.257 回答
0

你问它是因为静态(t1、t2 和 t3)声明给你的印象是每个实例都有自己的这些变量的副本。

实际上,这不会发生。静态变量不是按实例创建的。它们中只有一个实例存在于 JVM 中。

于 2013-03-12T14:12:05.517 回答
0

如果它会是这样的

public class Test {
   // no static so these are created for each instance of A or each time constructor is called
   public final Test t1 = new Test("test 1");
   public final Test t2 = new Test("test 2");
   public final Test t3 = new Test("test 3");

   private String s;

   private Test (string s1){
      s = s1
   }

}

然后它会创建无限的实例t1t2并且t3实例级变量

但在您的情况下,它们是static类加载时创建实例而不是每个实例,因此没有无限实例

于 2013-03-12T14:13:30.203 回答