2017-08-05 71 views
2

即使將靜態對象定義爲靜態,靜態對象如何訪問非靜態字段?靜態對象如何訪問非靜態字段,即使它被定義爲靜態?

public class pp { 
    static int x = 4; 
    int y = 8; 
    public static pp hj = new pp(); 

    public static void main(String[] args) { 
     System.out.println(hj.y); //prints 8 
    } 
} 
+0

因爲你是從一個實例得到'y'(即' hj')。 –

+0

它通過實例獲取靜態方法中的非靜態方法。 – atiqkhaled

回答

0

您可以訪問一個非靜態成員,如y,從靜態上下文,如main,只要你有一個靜態例如,從您正在訪問的非靜態成員。

在你的情況下,hj是一個靜態實例。它可以從靜態上下文訪問,以及y,這是它的非靜態字段。

相反,如果你試圖在靜態情況下訪問y沒有對象引用,您的代碼將無法編譯:

public class pp { 
    static int x = 4; 
    int y = 8; 
    static int z = y + 5; // <<=== This does not compile 

    public static void main(String[] args) { 
     System.out.println(y); // <<=== This does not compile either 
    } 
} 
0

hjpp類的static場肯定。但它也指pp的一個實例。

因此,您可以使用hj來訪問pp類的任何實例成員(方法或字段)。

但是,如果您嘗試訪問的實例字段:從static main method()

int y = 8; 

這樣:

public static void main(String[] args) { 
    System.out.println(y); 
} 

你會看到,你不能爲static成員不能指代實例成員。

0
public static pp hj = new pp(); 

如何靜態對象訪問非靜態字段,即使它定義爲靜態的?

這裏只是對象的引用是靜態的,這意味着要訪問變量(hj),您不需要創建它的所有者對象。

一旦你得到了對象的引用,你可以訪問對象成員,雖然它是靜態或非靜態的引用。

相關問題