考虑以下两个类A
和B
(java)以及各种包考虑因素:
public class A extends B {
public static class C {}
}
-------------
public class B extends A.C {
public B() {}
}
返回涉及A
的循环继承错误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语句更改为import P1.A
,然后将类定义更改为public class B extends A.C
,则会再次显示循环错误。
是什么解释了这种行为?
答案 0 :(得分:0)
在第一个例子中,A有一个循环。
如果A
扩展B
而B
扩展C
,因为C
是A
中的内部类,引用它的唯一方法是调用它A.C
,因此java会在A
上识别出这个循环:
A-->B-->A.C
(-->
=延伸)。
在第二个示例中,循环已移除。通过C
导入A
,B
不再需要A.C
,而只需C
:
A-->B-->C
。
因此将B放在一个单独的包中允许直接导入C而不必通过来调用它。
在示例3中(我们只导入P1.A
),我们仍然需要将C
称为A.C
,因此循环返回的原因。