假设我有以下课程:
abstract class A {
static abstract class _Foo {}
}
class B extends A {
static void doSomething() {
System.out.println(C.saySomething());
}
static _Foo getInner() {
return new C._Foo();
}
static abstract class _Foo extends A._Foo {}
}
final class C extends D {
static String saySomething() {
return "Something";
}
}
abstract class D {
static class _Foo extends B._Foo {
public int value() {
return 42;
}
}
}
提供一些背景信息:
C
和D
在编译时生成A
和C
都不会实例化;他们只是为类B
B
类是唯一实际使用的类。D
在编译期之后才是未知的,这就是为什么我们仅在C
中使用B
的原因。这与使用google autovalue
我的问题是关于getInner
中的B
函数:
_Foo
上将实例化哪个return new C._Foo();
? _Foo
中的D
或A
中的那个?最后一个问题就像供参考,我对前两个最感兴趣。
感谢您的帮助。
答案 0 :(得分:1)
要回答您的三个问题...
_Foo
中D
的实例将从new C._Foo()
返回。_Foo
是声明它们的类的“成员”,因此它们像变量一样被继承。 (在这种情况下,就像静态变量一样。)[Spec](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2)。 (这是我能找到的最好的文档。)C
立即继承的内容确定。由于C
扩展了D
,因此C
将继承D
拥有的内容(即D._Foo
)。如果D
未声明名为_Foo
的类,则D
将继承B
的{{1}},然后_Foo
会继承该类。 。希望这会有所帮助。 :)