2 回答
TA贡献1851条经验 获得超4个赞
是的,这是Java合成糖引起的Trap。您认为内部非静态类具有默认无参数构造函数,但这是错误的。在内部,IC1 的构造函数将 OC1 作为构造函数中的第一个参数——即使您看不到它。
这就是 OC2 构造函数必须使用 OC1 作为构造函数参数的原因:
public DataStructureChild(DataStructure argument) { }
不幸的是,这还不够,您需要确保参数不为空:
public DataStructureChild(DataStructure argument) { argument.super(); }
它看起来很奇怪,但它确实有效。
TA贡献1887条经验 获得超5个赞
您可以这样做,因为您继承了对父类内部类的访问权。
class DataStructureChild extends DataStructure {
public DataStructureChild() {
}
public void foo() {
InstanceArr ins = new InstanceArr();
ins.doSomething();
System.out.println(ins.a);
}
}
但能否请您提供一个链接或解释一下您是在哪里阅读以下内容的? 嵌套类可以访问其封闭类的所有私有成员——字段和方法。因此,子类继承的公共或受保护的嵌套类可以间接访问超类的所有私有成员。
我知道的第一部分。但是我从来没有考虑过一个单独的类扩展另一个类的内部类。特别是因为类与其封闭的内部类之间通常存在隐式关系。
编辑:
我相信你误解了这个声明。
它说你的子类继承了内部类。那是真实的。
它还说一旦完成,您就可以访问继承的内部类的私有值。如上所示,这也是正确的:
所以它只是在谈论通过继承访问内部类,而不是直接扩展它。
然而,如果你真的想在不传递引用的情况下拥有那种继承关系,你可以走这条路。
public class Inheritance extends Outer.Inner {
public Inheritance() {
new Outer().super();
}
public static void main(String[] args) {
new Inheritance().start();
}
public void start() {
System.out.println(a);
method();
}
}
class Outer {
public Outer() {
}
protected class Inner {
protected int a = 10;
protected Inner() {
}
protected void method() {
System.out.println("This is a private message");
}
}
}
添加回答
举报