0

考虑以下两个类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为循环错误再次显示。

什么解释了这种行为?

4

1 回答 1

0

在第一个示例中,A 有一个循环。如果AextendsBBextends C,因为C是一个内部类,A引用它的唯一方法是调用A.C,所以 java 认为这是一个循环A

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

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

A-->B-->C.

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

在示例 3 中(我们只导入P1.A),我们仍然必须引用Cas A.C,因此循环返回的原因。

于 2017-05-02T08:48:32.420 回答