具有自己类型的静态成员的类

时间:2017-06-17 19:55:05

标签: java

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关键字出现时不会发生这种情况?

提前致谢。

4 个答案:

答案 0 :(得分:1)

static表示在多个引用对象中使用该变量的单个实例(在本例中为y)。

static字段位于class的上下文中,这意味着该类的所有实例都将指向同一个static对象实例。 在以下情况中:

ABC a = new ABC();
ABC b = new ABC();
System.out.println(a.y==b.y);

打印结果为true,因为yab的实例都指向同一个对象。

非静态字段将填充自己的个体实例;意味着在以下场景中:

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错误。

相关问题