多继承泥潭-实例化哪个类?

时间:2018-08-22 02:31:22

标签: java multiple-inheritance undefined-behavior auto-value

假设我有以下课程:

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;
        }
    }
}

提供一些背景信息:

  • 所有这些类都位于同一包中。
  • CD在编译时生成
  • AC都不会实例化;他们只是为类B
  • 提供一些行为
  • B类是唯一实际使用的类。
  • D在编译期之后才是未知的,这就是为什么我们仅在C中使用B的原因。

这与使用google autovalue

时的预期相似

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

  1. 在行_Foo上将实例化哪个return new C._Foo();_Foo中的DA中的那个?
  2. 这种不确定的行为是针对哪个实例化的还是已记录的? 请尽可能提供文件
  3. 如何确定订单?

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

要回答您的三个问题...

  1. _FooD的实例将从new C._Foo()返回。
  2. 不,不是;不是。 _Foo是声明它们的类的“成员”,因此它们像变量一样被继承。 (在这种情况下,就像静态变量一样。)[Spec](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2)。 (这是我能找到的最好的文档。)
  3. 顺序由类C立即继承的内容确定。由于C扩展了D,因此C将继承D拥有的内容(即D._Foo)。如果D未声明名为_Foo的类,则D将继承B的{​​{1}},然后_Foo会继承该类。 。

希望这会有所帮助。 :)