匿名类构造函数不断循环

时间:2016-06-28 07:41:04

标签: java

当我使用下面的代码时,会看到stackoverflow异常。看起来第16行(即public my m1 = new my())被重复调用。有人可以解释一下连续调用它的原因。

abstract class my {
static int i = 0;
my(){

    System.out.println("my constructor " + i++);
}
public void mymethod() {
    System.out.println("Abstract");
}


public my m1 = new my() {

    public void mymethod() {
        System.out.println("Inside Abstract");
    }   
};

1 个答案:

答案 0 :(得分:1)

您有一个实例字段m1,您可以通过调用new my进行初始化。实例字段初始化在构造期间完成。 1 因此,您构造一个实例,并构建该实例需要构建另一个实例以分配给m1;构造该实例需要构造一个实例来分配给它的 m1;构建 it 需要构建另一个实例,其中......

你明白了。

作为Peter said,到目前为止,最好的方法是使用调试器逐步完成代码,以了解某些内容是如何工作的原因。使用调试器不是一种先进的技术,它是在学习语言过程中尽早学习的基本工具。

1 实际上,编译器接受实例初始化代码并将其插入到类中每个构造函数的开头。所以

class Foo {
    private int bar = 42;

    Foo() {
        System.out.println("no args");
    }

    Foo(int arg) {
        System.out.println("one arg: " + arg);
    }
}

实际编译为

class Foo {
    private int bar;

    Foo() {
        bar = 42
        System.out.println("no args");
    }

    Foo(int arg) {
        bar = 42
        System.out.println("one arg: " + arg);
    }
}