【问题标题】: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."
您的静态字段(t1、t2 和 t3)将在 Class 级别而不是 Instance 级别创建一次(每个)。
您的 3 个字段将在所有实例之间共享。
【解决方案2】:
代码不会创建无限的自身实例,因为变量 t1、t2 和 t3 是静态初始化的(意味着加载类时一次,而不是每个实例一次),因为 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
}
}
那么它将创建无限实例,因为t1、t2 和t3 是实例级变量。
但在您的情况下,它们是static,所以实例是在类加载时间创建的,而不是每个实例,所以没有无限的实例。