簡體   English   中英

通過java中的靜態方法訪問私有變量

[英]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 xprivate因此無法從類的范圍之外到達它。 您可以將其標記為protected 這樣它的范圍仍然有限。 擴展A的類將能夠自由地訪問變量。

這是因為點運算符優先於強制運算符。 這將起作用,因為它強制在點運算符之前應用強制轉換運算符:

System.out.println(((A)b).x);

在ideone上演示。

當您編寫(A)bx ,編譯器會嘗試將bx轉換為A ,但xint

此外,您不需要將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 xprivate因此無法從子類訪問它。

現在即使您將int x的訪問標准更改為publicprotected ; 代碼仍然無效,因為(A)bx將嘗試將一個整數(讀取x )類型轉換為對象(讀取A )。 而不是這個,你應該使用((A)b).x

暫無
暫無

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

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