了解 Java 的循环继承的异常行为

Understanding unusual behaviour with Java's cyclic inheritance

考虑以下两个 classes AB (java) 以及各种封装注意事项:

两个class都在默认包中

public class A extends B {

  public static class C {}

}

-------------
public class B extends A.C {

  public B() {}

}

returns 涉及 A

的循环继承错误

Class A 在名为 P1 的包中,Class B 在名为 P2 的包中

package P1;
import P2.B;

public class A extends B {

    public static class C {}

}

--------------
package P2;
import P1.A.C;

public class B extends C {

    public B() {}

}

编译无误。但是,如果我将 class B 中的导入语句更改为 import P1.A,然后将 class 定义更改为 public class B extends A.C,则会再次显示循环错误。

如何解释这种行为?

在第一个示例中,A 有一个循环。 如果 A 扩展 B 并且 B 扩展 C,因为 CA 中的内部 class 唯一引用方式它是调用 A.C,所以 java 在 A 上识别出这个循环:

A-->B-->A.C--> = 扩展)。

在第二个例子中,循环被移除。通过 A 导入 CB 不再需要扩展 A.C,而是简单地 C

A-->B-->C.

因此,将 B 放在单独的包中允许直接导入 C,而不必通过 A 调用它。

在示例 3 中(我们只导入 P1.A),我们仍然需要将 C 引用为 A.C,因此循环 returns 的原因。