请考虑以下两个类别A
和B
(Java(,具有各种软件包注意事项:
默认软件包中的两个类 public class A extends B {
public static class C {}
}
-------------
public class B extends A.C {
public B() {}
}
public class A extends B {
public static class C {}
}
-------------
public class B extends A.C {
public B() {}
}
返回涉及
的环状继承误差A类中的A类称为P1和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() {}
}
编译没有错误。但是,如果我将B类中的导入语句更改为 import P1.A
,然后将类定义更改为 public class B extends A.C
,则再次显示一个周期错误。
是什么解释了这种行为?
在第一个示例中,有一个周期。如果A
扩展了B
,并且B
扩展了C
,则因为C
是A
中的一个内类,引用它的唯一方法是调用A.C
,因此Java在A
上识别此周期:
A-->B-->A.C
( -->
=扩展(。
在第二个示例中,循环被删除。通过通过A
导入C
,B
不再需要扩展A.C
,而是简单地扩展C
:
A-->B-->C
。
因此,在单独的软件包中将B直接导入C,而不必通过通过 a。
调用b在示例3中(我们仅导入P1.A
(,我们仍然必须将C
称为A.C
,因此周期返回的原因。