我很难理解继承在嵌套类中是如何工作的,我在这里读过几个很好的问题,但是有些东西我不知道#&# 39; t get yet。
更具体地说,我希望这个例子
public class Main {
public static void main(String[] args) {
new O().new J();
}
}
class O{
O(){System.out.println("O");}
class I extends O{I(){System.out.println("I");}}
class J extends I{J(){System.out.println("J");}} //compile time error here
}
运行并打印OOIJ
,而我在类J
定义上遇到此编译时错误:No enclosing instance of type O is available due to some intermediate constructor invocation
。
我理解这是因为嵌套类J
在初始化之前需要O
的实例存在,但我想我错过了一些关于我尝试创建J
对象时发生的实例化链。
为什么会这样?为什么要将I
的定义更改为
class I {I(){System.out.print("I");}}
避免任何编译时错误并按照我的预期打印OIJ
?
我认为this主题只回答了我的第一个问题:
为什么会这样?
因为J的超类本身就是一个内在的阶级,因此制作 J的默认构造函数是非法的,因为它需要一个封闭 要提供给构造函数的实例。
但第二个问题仍未得到答复:
为什么将
I
的定义更改为class I {I(){System.out.print("I");}}
避免任何编译时错误并按照我的预期打印
OIJ
?
问题仍然存在吗? J
的超类仍然是一个内部类,那为什么现在要编译呢?
Further_1 ,如果我声明I
和J
方法本地
public class Main {
public static void main(String[] args) {
new O().foo();
}
}
class O{
O(){System.out.print("O");}
void foo(){
class I extends O{I(){System.out.print("I");}}
class J extends I{J(){System.out.print("J");}}
new J();
}
}
没有错误发生,并按预期打印OOIJ
。
Further_2 ,如果我声明I
和J
静态
public class Main {
public static void main(String[] args) {
new O.J();
}
}
class O{
O(){System.out.print("O");}
static class I extends O{I(){System.out.print("I");}}
static class J extends I{J(){System.out.print("J");}}
}
我按预期得到OIJ
。