我知道这是没有意义的:我只是觉得很有趣,我想更多地询问创建继承自己的类时会发生什么机制,从而导致堆栈溢出崩溃。 Java允许您从这样的构造开始就令人惊奇。

我只是在猜测,但是JVM是将自己置于无限循环中,试图在实例化类之前解析该类,还是实际上是在无休止地实例化该类的多个副本?

我应该更具体一些;我正在使用内部类从封闭类派生。

 public class Outside {
    private int outsideValue;

    public class Inside extends Outside {
        private int insideValue;
        public Inside(int val) {
            insideValue = val;
        }
    }

    public Outside() {
        Inside o = new Inside(0);
    }
}

public class Main {
    public static void main(String args[]) {
        Outside o = new Outside();
    }
}

最佳答案

请记住,由于Inside扩展了Outside,因此它对super() 进行了隐式调用,它是Outside的构造函数(反过来又称为Inside的构造函数),因此它可以解决。

您在上发布的代码在概念上与以下程序相同:

class A {
    B b = new B();
}

class B extends A {
}

public class Test {
    public static void main(String[] args) {
        new A(); // Create an A...
                 //   ... which creates a B
                 //   ... which extends A thus implicitly creates an A
                 //   ... which creates a B
                 //   ...
    }
}

09-03 20:20