2 回答

TA貢獻1851條經(jīng)驗 獲得超4個贊
是的,這是Java合成糖引起的Trap。您認為內(nèi)部非靜態(tài)類具有默認無參數(shù)構(gòu)造函數(shù),但這是錯誤的。在內(nèi)部,IC1 的構(gòu)造函數(shù)將 OC1 作為構(gòu)造函數(shù)中的第一個參數(shù)——即使您看不到它。
這就是 OC2 構(gòu)造函數(shù)必須使用 OC1 作為構(gòu)造函數(shù)參數(shù)的原因:
public DataStructureChild(DataStructure argument) { }
不幸的是,這還不夠,您需要確保參數(shù)不為空:
public DataStructureChild(DataStructure argument) { argument.super(); }
它看起來很奇怪,但它確實有效。

TA貢獻1887條經(jīng)驗 獲得超5個贊
您可以這樣做,因為您繼承了對父類內(nèi)部類的訪問權(quán)。
class DataStructureChild extends DataStructure {
public DataStructureChild() {
}
public void foo() {
InstanceArr ins = new InstanceArr();
ins.doSomething();
System.out.println(ins.a);
}
}
但能否請您提供一個鏈接或解釋一下您是在哪里閱讀以下內(nèi)容的? 嵌套類可以訪問其封閉類的所有私有成員——字段和方法。因此,子類繼承的公共或受保護的嵌套類可以間接訪問超類的所有私有成員。
我知道的第一部分。但是我從來沒有考慮過一個單獨的類擴展另一個類的內(nèi)部類。特別是因為類與其封閉的內(nèi)部類之間通常存在隱式關(guān)系。
編輯:
我相信你誤解了這個聲明。
它說你的子類繼承了內(nèi)部類。那是真實的。
它還說一旦完成,您就可以訪問繼承的內(nèi)部類的私有值。如上所示,這也是正確的:
所以它只是在談?wù)撏ㄟ^繼承訪問內(nèi)部類,而不是直接擴展它。
然而,如果你真的想在不傳遞引用的情況下?lián)碛心欠N繼承關(guān)系,你可以走這條路。
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");
}
}
}
添加回答
舉報