了解 Java 的循环继承的异常行为
Understanding unusual behaviour with Java's cyclic inheritance
考虑以下两个 classes A
和 B
(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
,因为 C
是 A
中的内部 class 唯一引用方式它是调用 A.C
,所以 java 在 A
上识别出这个循环:
A-->B-->A.C
(-->
= 扩展)。
在第二个例子中,循环被移除。通过 A
导入 C
,B
不再需要扩展 A.C
,而是简单地 C
:
A-->B-->C
.
因此,将 B 放在单独的包中允许直接导入 C,而不必通过 A 调用它。
在示例 3 中(我们只导入 P1.A
),我们仍然需要将 C
引用为 A.C
,因此循环 returns 的原因。
考虑以下两个 classes A
和 B
(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
,因为 C
是 A
中的内部 class 唯一引用方式它是调用 A.C
,所以 java 在 A
上识别出这个循环:
A-->B-->A.C
(-->
= 扩展)。
在第二个例子中,循环被移除。通过 A
导入 C
,B
不再需要扩展 A.C
,而是简单地 C
:
A-->B-->C
.
因此,将 B 放在单独的包中允许直接导入 C,而不必通过 A 调用它。
在示例 3 中(我们只导入 P1.A
),我们仍然需要将 C
引用为 A.C
,因此循环 returns 的原因。