class ABC {
int x;
static ABC y = new ABC();
}
public class XYZ {
public static void main(String[] args) {
ABC q = new ABC();
q.x = 5;
System.out.println(q.x);
}
}
有人可以解释代码运行时所发生的一切(步骤)。
此外,在实例static
之前删除y
关键字时,会发生 StackOverflow 错误。为什么在static
关键字出现时不会发生这种情况?
提前致谢。
答案 0 :(得分:1)
static
表示在多个引用对象中使用该变量的单个实例(在本例中为y
)。
static
字段位于class
的上下文中,这意味着该类的所有实例都将指向同一个static
对象实例。
在以下情况中:
ABC a = new ABC();
ABC b = new ABC();
System.out.println(a.y==b.y);
打印结果为true
,因为y
和a
上b
的实例都指向同一个对象。
非静态字段将填充自己的个体实例;意味着在以下场景中:
ABC a = new ABC();
ABC b = new ABC();
System.out.println(a.y==b.y);
(在假设不会触发StackOverflow的情况下)会产生false
,因为a.y
不 与b.y
相同的实例;每个人在ABC
字段中都有自己独立的y
个实例。
StackOverflow
将在没有static
关键字的情况下发生,因为当实例化ABC时,它需要另一个ABC实例用于它的y
字段,在实例化时,会创建另一个ABC,等等,无限(直到堆栈溢出)。
使用static
,ABC的单个静态实例,让我们调用它sABC
,并且它自己的y
字段只引用它本身,所以实例化的无限循环不会发生。
答案 1 :(得分:0)
当类加载器加载此类时,它将立即创建此类的实例并将其分配给类变量y。这是因为y被声明为静态。 如果你没有声明y static,那么你就说ABC类的每个实例都有一个属性y,它也是一个ABC。您还要说y属性必须分配一个新的ABC类实例,因此每当您显式创建ABC实例时都会为您创建此实例,就像在main()中的第一个语句中一样。你发现了递归吗?这会导致堆叠过度。
答案 2 :(得分:0)
静态变量是类级变量。
实例变量是对象级变量。
如果删除static
关键字 - 此类尝试实例化自身并发生无限循环,而静态变量一次创建一个实例,并在所有对象之间共享。
堆栈内存保留了本地变量和函数调用,因此它会溢出,因为您有无限的调用。
答案 3 :(得分:0)
ABC q = new ABC();
创建名为ABC
q
类的新实例
q.x = 5;
将q
的属性x
设置为5
System.out.println(q.x);
打印q
的属性x
所持有的值(应为5)
static
关键字表示类的每个实例共享同一个变量。当您创建类ABC
的实例时,它包含另一个ABC
实例作为变量y
。当您创建另一个ABC
实例时,它还有一个变量y
,但该变量与第一个y
实例所拥有的ABC
相同。
如果您要删除static
关键字,y
的每个实例都不会共享ABC
。当您创建ABC
的实例时,它会创建自己的y
,而y
会创建自己的y
,依此类推,直到内存不足为止发生StackOverflow
错误。