关于以下代码的快速提问:
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;
}
}
我很困惑这段代码是否会创建自己的无限实例?
答案 0 :(得分:3)
虚拟机不会:"create unlimited instances of itself."
您的静态字段(t1
,t2
和t3
)将在Class
级别创建一次(每个),而不是Instance
级别。
您的3个字段将在所有实例之间共享。
答案 1 :(得分:1)
代码不会创建自己的无限实例,因为变量t1
,t2
和t3
静态初始化(意味着当类加载时一次因为 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
}
}
然后它会创建无限制的实例,因为t1
,t2
和t3
是实例级变量。
但是在你的情况下,它们是static
所以实例是在类加载时间上创建的,而不是每个实例都是如此没有无限的实例。