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");
}
}
}
添加回答
舉報