为什么我们无法在构造函数中创建非静态自引用对象

时间:2014-07-01 08:51:26

标签: java static self-reference

当我尝试在构造函数中创建一个带有自引用的对象时,我得到了StackOverflowError。

public class Example1 {
    private int i;
    private Example1 zero;

    public Example1(int i) {
        super();
        if (i > 0) {
            this.i = i;
        } else {
            this.i = this.zero.i;
        }
        this.zero = new Example1(i);
    }

    public int getI() {
        return i;
    }

但是当我使用静态引用时,不会发生错误。

public class Example2 {
    private int i;
    private static final Example2 ZERO = new Example2(0);

    public Example2() {
        this(ZERO.i);
    }

    public Example2(int i) {
        super();
        this.i = i;
    }

    public int getI() {
        return i;
    }

由于静态对象在加载类时会被初始化,因此我能够理解它。

但是在对象创建过程中发生了什么,有谁可以详细解释一下?

2 个答案:

答案 0 :(得分:12)

Exampel1在构造函数中递归创建新实例。

静态字段只会创建一次。这就是为什么示例1创建了溢出而第二个没有。

答案 1 :(得分:0)

静态修饰符意味着无论你做什么静态都是在该类的所有对象之间共享的。因为我相信你想做一个类似"默认对象"在每个Example1对象中,最好的方法是使其静态。这样,您可以根据需要创建任意数量的Example1对象(或者您的内存允许),但每个对象都将共享静态的Example1零对象。

这里的非静态对象是不可能的,因为否则它会尝试在你刚创建的Example1对象中创建另一个Example1对象,当然其他人已经说过了无限循环中的另一个Example1对象。