-1

假设我有以下课程:

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在编译时生成
  • A以及C从不实例化;他们只是为课堂提供一些行为B
  • B是唯一实际使用的。
  • D在编译之后是未知的,这就是我们只使用Cin 的原因B

这类似于人们在使用google autovalue


我的问题是关于getInner函数B

  1. 哪个_Foo将在该行被实例化return new C._Foo();_Foo里面还是里面的D那个A
  2. 这种未定义的行为是关于实例化的还是记录在案的?如果可能,请提供文件
  3. 顺序是如何确定的?

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

谢谢你的帮助。

4

1 回答 1

1

回答你的三个问题...

  1. _Fooin的一个实例D将从 中返回new C._Foo()
  2. 不,不是;_Foos 是声明它们的类的“成员”,因此它们像变量一样被继承。(在这种情况下,就像静态变量一样。)[规范](https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.2)。(这是我能收集到的最好的文档。)
  3. 顺序由类立即继承的内容决定C。由于Cextends DC将继承任何D有(即D._Foo)。如果D没有声明一个名为 的类_Foo,那么D将继承B's _Foo,然后C将继承它。

希望这可以帮助。:)

于 2018-08-22T05:33:23.553 回答