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



请考虑以下两个类别AB(Java(,具有各种软件包注意事项:

默认软件包中的两个类
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,则因为CA中的一个内类,引用它的唯一方法是调用A.C,因此Java在A上识别此周期:

>

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

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

A-->B-->C

因此,在单独的软件包中将B直接导入C,而不必通过通过 a。

调用b

在示例3中(我们仅导入P1.A(,我们仍然必须将C称为A.C,因此周期返回的原因。

最新更新