【问题标题】:Creating objects of a class within the class在类中创建类的对象
【发布时间】:2013-02-28 02:21:55
【问题描述】:

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

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

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

【问题讨论】:

标签: java string forms oop class


【解决方案1】:

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

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

【讨论】:

  • 简单明了。 +1
【解决方案2】:

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

您可能想了解static 的具体作用。

实用提示:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        如果是这样的话

        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,所以实例是在类加载时间创建的,而不是每个实例,所以没有无限的实例

        【讨论】:

          猜你喜欢
          • 2023-03-18
          • 2015-12-30
          • 1970-01-01
          • 2016-05-03
          • 2015-11-17
          • 2023-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多