多重继承的泥潭——哪个 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;
        }
    }
}

提供一些背景信息:

这与使用 google autovalue

时的预期相似

我的问题是关于 B 中的 getInner 函数:

  1. 哪个 _Foo 将在 return new C._Foo(); 行被实例化? D 中的 _FooA?
  2. 中的那个
  3. 这种未定义的行为是否被实例化或记录在案? 如果可能请提供证明文件
  4. 顺序是如何确定的?

最后一个问题仅供参考,我对前两个最感兴趣。

感谢您的帮助。

回答你的三个问题...

  1. D_Foo 的实例将从 new C._Foo() 返回。
  2. 不,不是; _Foo 是它们在其中声明的 class 的 "members",因此它们很像变量一样被继承。 (在这种情况下,就像静态变量一样。)[Spec] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2)。 (这是我能收集到的最好的文档。)
  3. 顺序由 class C 直接继承的内容决定。由于 C 扩展了 DC 将继承 D 的所有内容(即 D._Foo)。如果 D 没有声明一个名为 _Foo 的 class,那么 D 将继承 B_Foo,然后 C 会继承它。

希望这对您有所帮助。 :)