当我使用下面的代码时,会看到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");
}
};
答案 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);
}
}