Java ClassCircularityError,运行时或编译时间?

时间:2012-05-26 10:14:03

标签: java exception inheritance specifications

我正在阅读JVM规范第2版。在本节(Loading)中,如果类是自己的超类或超接口,则无法加载类时,会定义ClassCircularityError。我无法想象/想象它,因为当我编译这样一个类时,java编译器阻止我在那里并且不会让我继续。然后如何创建这样的.class来加载?

public class TestCycle extends TestCycle{
private String memberVar;
}

有人可以向我的罐头解释这个吗?

2 个答案:

答案 0 :(得分:3)

在Java中,编译单元是类,因此很可能在不同的时间编译类,例如因为这些类是由于位于不同的库中而独立开发的。考虑:

class A {}

其他人呢

class B {}

现在,A的制造商决定他们想扩展B:

class A extends B {}
并且B的制造者决定他们想扩展A,但不知道前者的变化,即仍然有A的原始定义:

class B extends A{}

后来,他们意识到A的新版本可用,并将其放在类路径中,导致加载时出现ClassCircularityError。

答案 1 :(得分:1)

您可以通过直接编辑类文件来创建这样的类文件(我的意思是,如果您真的想要)。因此,虽然它不能编译,但可以创建一个包含这样一个类的有效类文件。这也是JVM检查它的原因。