簡體   English   中英

Java通過受保護的getter訪問私有超類成員

[英]Java accessing private superclass member through protected getter

我知道在Java中,只要超類提供了公共或受保護的getter方法,就可以訪問子類中超類的私有成員。 但是我也知道,該子類實際上並不繼承私有成員。 考慮以下情形...

Class A {
    private var = 2;
    protected int getVar(){
        return var;
    }
}

Class B extends A{

   public void printVar(){
       System.out.println(getVar());
   }
}

Class Main{

    public static void main(args []){

         B b= new B();
         b.printVar();
    }
}

我想了解一下,因為我們正在創建子類B的一個實例,那么該私有成員究竟在什么時候分配給內存,它的作用范圍是什么? 由於實際上從未創建A的實例,所以它怎么存在? 它不是靜態變量,也不是最終變量,因此它是堆棧動態的還是隱式堆動態的? 我以為,當您從超類實例化子類時,您也會繼承非私有成員和方法成員,然后將這些成員實例化為子類的對象實例的一部分(除非它們被重寫等),因此只有一個對象分配為堆動態變量。 但是,如果這些私有成員沒有被繼承,那么在調用繼承的getter方法的情況下(僅在這種情況下),編譯器是否僅向它們提供堆棧動態引用?

您認為超類的私有成員未被子類繼承的假設是錯誤的。 所有成員都是繼承的。 子類的私有成員是子類實例的一部分,但是子類的代碼不能直接訪問它們。

在超類中有一個受保護的getter來返回私有成員的值,這為子類提供了一種訪問私有成員值的方法(盡管它不能修改它,除非您也有一個受保護的或公共的setter在超一流)。

但是我也知道,該子類實際上並不繼承私有成員。

是的,它確實。 的一個實例B 實例A ,它包含所有的相同的字段。 您不再可以直接訪問私有字段,但是它們仍然存在。

由於實際上從未創建A的實例,所以它怎么存在?

創建B ,也會調用A的構造函數,以確保B實例正確初始化為有效A 不要將子類視為與超類不同的東西。 A B仍然是A ; 它做得更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM