在类中创建类的对象

时间:2013-03-12 14:07:54

标签: java string forms oop class

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

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

我很困惑这段代码是否会创建自己的无限实例

5 个答案:

答案 0 :(得分:3)

虚拟机不会:"create unlimited instances of itself."

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

答案 1 :(得分:1)

代码不会创建自己的无限实例,因为变量t1t2t3 静态初始化(意味着当类加载时一次因为 static声明与声明中的赋值相结合,而不是每个实例一次)。

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

实用说明:

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

public class Test {
   static Test t1;
   Test () {
      t1 = new Test();
   }
}

答案 2 :(得分:1)

静态成员不是创建对象的一部分。因此,不会无限制地创建Test个对象。

答案 3 :(得分:0)

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

实际上,这不会发生什么。不是每个实例都创建静态变量。 JVM中只存在一个实例。

答案 4 :(得分: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
   }

}

然后它会创建无限制的实例,因为t1t2t3实例级变量

但是在你的情况下,它们是static所以实例是在类加载时间上创建的,而不是每个实例都是如此没有无限的实例