多重继承的泥潭——哪个 class 被实例化了?
Multiple inheritance quagmire - which class is instantiated?
假设我有以下 classes:
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;
}
}
}
提供一些背景信息:
- 所有这些 class 都位于同一个包中。
- Class
C
和D
在编译时生成
- Class
A
以及 C
永远不会实例化;他们只是为 class B
提供一些行为
- Class
B
是唯一一个实际用到的
- Class
D
直到编译后才知道,这就是为什么我们只在 B
. 中使用 C
这与使用 google autovalue
时的预期相似
我的问题是关于 B
中的 getInner
函数:
- 哪个
_Foo
将在 return new C._Foo();
行被实例化? D
中的 _Foo
或 A
? 中的那个
- 这种未定义的行为是否被实例化或记录在案? 如果可能请提供证明文件
- 顺序是如何确定的?
最后一个问题仅供参考,我对前两个最感兴趣。
感谢您的帮助。
回答你的三个问题...
D
中 _Foo
的实例将从 new C._Foo()
返回。
- 不,不是;
_Foo
是它们在其中声明的 class 的 "members",因此它们很像变量一样被继承。 (在这种情况下,就像静态变量一样。)[Spec] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2)。 (这是我能收集到的最好的文档。)
- 顺序由 class
C
直接继承的内容决定。由于 C
扩展了 D
,C
将继承 D
的所有内容(即 D._Foo
)。如果 D
没有声明一个名为 _Foo
的 class,那么 D
将继承 B
的 _Foo
,然后 C
会继承它。
希望这对您有所帮助。 :)
假设我有以下 classes:
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;
}
}
}
提供一些背景信息:
- 所有这些 class 都位于同一个包中。
- Class
C
和D
在编译时生成 - Class
A
以及C
永远不会实例化;他们只是为 classB
提供一些行为
- Class
B
是唯一一个实际用到的 - Class
D
直到编译后才知道,这就是为什么我们只在B
. 中使用
C
这与使用 google autovalue
我的问题是关于 B
中的 getInner
函数:
- 哪个
_Foo
将在return new C._Foo();
行被实例化?D
中的_Foo
或A
? 中的那个
- 这种未定义的行为是否被实例化或记录在案? 如果可能请提供证明文件
- 顺序是如何确定的?
最后一个问题仅供参考,我对前两个最感兴趣。
感谢您的帮助。
回答你的三个问题...
D
中_Foo
的实例将从new C._Foo()
返回。- 不,不是;
_Foo
是它们在其中声明的 class 的 "members",因此它们很像变量一样被继承。 (在这种情况下,就像静态变量一样。)[Spec] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2)。 (这是我能收集到的最好的文档。) - 顺序由 class
C
直接继承的内容决定。由于C
扩展了D
,C
将继承D
的所有内容(即D._Foo
)。如果D
没有声明一个名为_Foo
的 class,那么D
将继承B
的_Foo
,然后C
会继承它。
希望这对您有所帮助。 :)