Java 不一致的类层次结构
我已经阅读了关于类构造函数的内容,然后出现了一个问题,即为什么以下层次结构不正确:Java 不一致的类层次结构,java,class,inheritance,Java,Class,Inheritance,我已经阅读了关于类构造函数的内容,然后出现了一个问题,即为什么以下层次结构不正确: public class Test extends Subclass.Inner{ //compile-time error //The hierarchy of the type Test is inconsistent public Test() { super(); } } public class Subclass
public class Test extends Subclass.Inner{ //compile-time error
//The hierarchy of the type Test is inconsistent
public Test() {
super();
}
}
public class Subclass extends Test{
public class Inner{
}
}
正式地
如果超类构造函数调用语句是非限定的,并且
如果S是内部成员类,那么如果S是
不是通过声明或
继承
我认为这个例子完全符合我引用的规则。在这种情况下,子类
通过继承在词汇上包含了测试
的类。为什么代码不能正常工作?您能提供一个适当的例子来反映吗?内部实例类(非静态)实际上是这样转换的:
public class Subclass extends Test {
public class Inner {
}
}
变成这样:
public class Subclass extends Test {
}
public class Inner {
Subclass parent;
public Inner(Subclass parent) {
this.parent = parent;
}
}
以下各项有效:
public class Container extends Subclass {
public class Test extends Subclass.Inner {
public Test() {
super();
}
}
}
public class Subclass {
public class Inner {
}
}
内部类的实例必须具有封闭实例,该实例在内部类实例之前初始化。另一方面,超类构造函数总是在子类构造函数之前执行。因此,创建
子类
的实例需要首先调用Test
的构造函数,这需要首先调用子类.Inner
的构造函数,但是子类.Inner
不能在其包含实例之前初始化
我相信为了满足你所引用的条件,超类内部必须包含一个超类的测试。在您的情况下,它包含在一个子类Test中。这里有一个您缺少的子句(): 如果在C的
扩展
或实现
子句中将T作为超类或超接口、或作为超类或超接口名称的限定符,则类C直接依赖于类型T
如果满足以下任一条件,则C类取决于参考类型T:
- C直接依赖于依赖于T的类D(递归使用此定义)。
子类
的超类声明包含子类
作为超类名称的限定符
除此之外,这里还有一个非常奇怪的循环定义<代码>测试本身就是一个外部范围
这也不会编译,尽管它不像内部类那样令人费解:
class Test implements Test.ITest {
interface ITest {}
}
Netbeans给了我一个更直接的错误,即存在“循环继承”。类声明不允许以这种方式引用自身