[英]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.