[英]Accessing private fields of an instance created through a static method with a setter method in Java gone wrong - what can be done?
[英]Accessing a private variable through static method in java
假設我有以下java類:
A類:
public class A {
private int x;
public A(int x){
this.x = x;
}
public static void main(String[] args) {
A a = new A(1);
B b = new B(1,2);
System.out.println((A)b.x);
}
}
B級:
public class B extends A {
public int y;
public B(int x, int y){
super(x);
this.y = y;
}
}
為什么編譯器會在此行上標記對x的訪問
System.out.println((A)b.x);
作為一個錯誤,即使我試圖從定義它的類訪問x?
是因為:
1.使用多態?
2.使用靜態方法?
3.使用主要方法?
你需要做((A)b).x
來正確輸入它
注意:您正在嘗試將屬性x
類型轉換為類型A
那是錯誤!
int x
是private
因此無法從類的范圍之外到達它。 您可以將其標記為protected
。 這樣它的范圍仍然有限。 擴展A的類將能夠自由地訪問變量。
當您編寫(A)bx
,編譯器會嘗試將bx
轉換為A
,但x
是int
此外,您不需要將b
轉換為A
並且您無法訪問bx
因為x
是私有字段。
你可能需要一個getter,比如b.getX()
你有以下問題
"Field not visible"
錯誤,因為您嘗試訪問父類的私有方法 .
運算符優先於強制運算符 private
,不會被繼承。 即使您轉換為父級,也無法使用子對象訪問私有成員。 因為你試圖將一個int
轉換為A
你需要圍繞對象包裹演員然后調用.x
。
你的電話相當於(A)(bx)
,應該是((A)b).x
。
public static void main(String[] args) {
A a = new A(1);
B b = new B(1,2);
System.out.println(((A)b).x);
}
基本上,這里存在兩個問題。
一個是int x
是private
因此無法從子類訪問它。
現在即使您將int x
的訪問標准更改為public
或protected
; 代碼仍然無效,因為(A)bx
將嘗試將一個整數(讀取x
)類型轉換為對象(讀取A
)。 而不是這個,你應該使用((A)b).x
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.