第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在java中擴展一個內(nèi)部類

在java中擴展一個內(nèi)部類

炎炎設(shè)計 2023-04-26 16:45:39
當(dāng)涉及到內(nèi)部類時,我在嘗試實現(xiàn)我在 Oracle 文檔中閱讀的有關(guān)繼承的聲明時遇到了麻煩。該聲明 :嵌套類可以訪問其封閉類的所有私有成員——字段和方法。因此,子類繼承的公共或受保護的嵌套類可以間接訪問超類的所有私有成員。為了測試這一點,即看看我是否可以實現(xiàn)上述目標,我創(chuàng)建了一個具有內(nèi)部類 IC1 的頂級類 OC1,然后我創(chuàng)建了另一個擴展 IC1 的頂級類 OC2。在我什至可以開始編寫單個方法之前,IDE 在 OC2 類主體本身處阻止了我說“由于某些中間構(gòu)造函數(shù)調(diào)用,沒有類型 DataStructure 的封閉實例可用”我讀了一些其他答案,其中大部分指向 a) 將內(nèi)部類更改為靜態(tài)嵌套類——它解決了錯誤 b) 整個場景是不必要的和復(fù)雜的。這是代碼: 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(){    }}我知道這種情況并不理想,但我不想將內(nèi)部類更改為靜態(tài)嵌套類 - 這會破壞我的目的,即基本上嘗試查看是否可以在沒有 OC1 實例的情況下訪問 arrayOfInts。我誤解了這句話嗎?如果沒有,請指出我正確的方向。PS - 這是我的第一個問題 - 如果某些準則被蔑視,請?zhí)崆暗狼浮?
查看完整描述

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();
}

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


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

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)系。

編輯:

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

  1. 它說你的子類繼承了內(nèi)部類。那是真實的。

  2. 它還說一旦完成,您就可以訪問繼承的內(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");

          }

       }

    }


查看完整回答
反對 回復(fù) 2023-04-26
  • 2 回答
  • 0 關(guān)注
  • 270 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號