使用Java的循环继承理解异常行为

时间:2017-04-26 16:10:23

标签: java inheritance packages cyclic

考虑以下两个类AB(java)以及各种包考虑因素:

默认包中的两个类

public class A extends B {

  public static class C {}

}

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

  public B() {}

}

返回涉及A

的循环继承错误

在名为P2

的包中名为P1和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,则会再次显示循环错误。

是什么解释了这种行为?

1 个答案:

答案 0 :(得分:0)

在第一个例子中,A有一个循环。 如果A扩展BB扩展C,因为CA中的内部类,引用它的唯一方法是调用它A.C,因此java会在A上识别出这个循环:

A-->B-->A.C--> =延伸)。

在第二个示例中,循环已移除。通过C导入AB不再需要A.C,而只需C

A-->B-->C

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

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