亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在java中擴展一個內部類

在java中擴展一個內部類

炎炎設計 2023-04-26 16:45:39
當涉及到內部類時,我在嘗試實現我在 Oracle 文檔中閱讀的有關繼承的聲明時遇到了麻煩。該聲明 :嵌套類可以訪問其封閉類的所有私有成員——字段和方法。因此,子類繼承的公共或受保護的嵌套類可以間接訪問超類的所有私有成員。為了測試這一點,即看看我是否可以實現上述目標,我創建了一個具有內部類 IC1 的頂級類 OC1,然后我創建了另一個擴展 IC1 的頂級類 OC2。在我什至可以開始編寫單個方法之前,IDE 在 OC2 類主體本身處阻止了我說“由于某些中間構造函數調用,沒有類型 DataStructure 的封閉實例可用”我讀了一些其他答案,其中大部分指向 a) 將內部類更改為靜態嵌套類——它解決了錯誤 b) 整個場景是不必要的和復雜的。這是代碼: public class DataStructure {    // Create an array    private final static int SIZE = 15;    private int[] arrayOfInts = new int[SIZE];    public DataStructure() {        // fill the array with ascending integer values        super();        for (int i = 0; i < SIZE; i++) {            arrayOfInts[i] = i;        }    }    //other methods    //IC1    protected  class instanceArr{        private int a = 8;        private static final int B = 4;        protected instanceArr(){        }        protected void doSomething(){            System.out.println("arrayOfInts[] is accessible " + arrayOfInts[6]);        }    }    //main method}OC2public class DataStructureChild extends DataStructure.instanceArr{    public DataStructureChild(){    }}我知道這種情況并不理想,但我不想將內部類更改為靜態嵌套類 - 這會破壞我的目的,即基本上嘗試查看是否可以在沒有 OC1 實例的情況下訪問 arrayOfInts。我誤解了這句話嗎?如果沒有,請指出我正確的方向。PS - 這是我的第一個問題 - 如果某些準則被蔑視,請提前道歉。
查看完整描述

2 回答

?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

是的,這是Java合成糖引起的Trap。您認為內部非靜態類具有默認無參數構造函數,但這是錯誤的。在內部,IC1 的構造函數將 OC1 作為構造函數中的第一個參數——即使您看不到它。

這就是 OC2 構造函數必須使用 OC1 作為構造函數參數的原因:

public DataStructureChild(DataStructure argument) {
}

不幸的是,這還不夠,您需要確保參數不為空:

public DataStructureChild(DataStructure argument) {
    argument.super();
}

它看起來很奇怪,但它確實有效。


查看完整回答
反對 回復 2023-04-26
?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

您可以這樣做,因為您繼承了對父類內部類的訪問權。


class DataStructureChild extends DataStructure {

    public DataStructureChild() {

    }


    public void foo() {

         InstanceArr ins = new InstanceArr();

         ins.doSomething();

         System.out.println(ins.a);

    }

}

但能否請您提供一個鏈接或解釋一下您是在哪里閱讀以下內容的? 嵌套類可以訪問其封閉類的所有私有成員——字段和方法。因此,子類繼承的公共或受保護的嵌套類可以間接訪問超類的所有私有成員。

我知道的第一部分。但是我從來沒有考慮過一個單獨的類擴展另一個類的內部類。特別是因為類與其封閉的內部類之間通常存在隱式關系。

編輯:

我相信你誤解了這個聲明。

  1. 它說你的子類繼承了內部類。那是真實的。

  2. 它還說一旦完成,您就可以訪問繼承的內部類的私有值。如上所示,這也是正確的:

所以它只是在談論通過繼承訪問內部類,而不是直接擴展它。

然而,如果你真的想在不傳遞引用的情況下擁有那種繼承關系,你可以走這條路。

   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");

          }

       }

    }


查看完整回答
反對 回復 2023-04-26
  • 2 回答
  • 0 關注
  • 261 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號