2012-11-19 96 views
0

可能重複:
What is the reason behind 「non-static method cannot be referenced from a static context」?的Java:非靜態變量這不能從靜態上下文中引用

我是新來的Java。我有以下幾組代碼,如下所示。

class Default 
{ 
    private short s; 
    private int i; 
    private long l; 
    private float f; 
    private double d; 
    private char c; 
    private String str; 
    private boolean b; 

    public static void main (String args[ ]) 
    { 

     Default df = new Default(); 

     System.out.println("\n Short = "+s); 

     System.out.println ("\n int i =" + i); 
     System.out.println ("\n long l =" + l); 
     System.out.println ("\n float f =" + f); 
     System.out.println ("\n double d =" + d); 
     System.out.println ("\n char c =" + c); 
     System.out.println ("\n String s =" + str); 
     System.out.println("\n boolean b =" + b); 
    } 
} 

這產生了一個錯誤消息作爲這個問題的主題,但下面的代碼完美的作品。

class Default 
{ 
    private short s; 
    private int i; 
    private long l; 
    private float f; 
    private double d; 
    private char c; 
    private String str; 
    private boolean b; 

    public static void main (String args[ ]) 
    { 

     Default df = new Default(); 

     System.out.println("\n Short = "+df.s); 

     System.out.println ("\n int i =" + df.i); 
     System.out.println ("\n long l =" + df.l); 
     System.out.println ("\n float f =" + df.f); 
     System.out.println ("\n double d =" + df.d); 
     System.out.println ("\n char c =" + df.c); 
     System.out.println ("\n String s =" + df.str); 
     System.out.println("\n boolean b =" + df.b); 
    } 
} 

這給出了期望的結果。這兩組代碼有什麼區別。

回答

2

您有一個名爲df的實例化對象Default,它正在調用這些變量。由於您創建的變量不是static,它們必須是已創建的某個對象的一部分。

Default df = new Default(); 
df.i //<- is now a part of the instantiated object df. 

如果關鍵字static未與對象一起使用,則使用關鍵字static。所以,你可以只說:

private static char c; 

然後你就可以隨時打電話char c,這將是null因爲你沒有給它的值呢。當你使用那個沒有對象的變量或方法時,你使用static

1

這兩組代碼之間的區別在於,在第二個示例中,您有一個類的實例,當您說Default df = new Default();時,您創建了這個實例。

您已將Default類中的所有變量聲明爲實例級變量,這意味着要訪問它們,您必須通過類的特定實例。換句話說,你的類的每個實例都有自己的一組變量,所以編譯器知道你實際訪問哪一個的唯一方法就是如果你先指定了你想使用的實例。

例如,你可以這樣做:

Default df = new Default(); 
Default anotherOne = new Default(); 

df.s = 1; 
anotherOne.s = 2; 

System.out.println("\n Short(df) = "+df.s);     //'1' 
System.out.println("\n Short(anotherOne) = "+anotherOne.s); //'2' 

與試圖直接從main()訪問實例變量(或任何其他靜態方法)的問題是,main()方法不直接與任何實例相關聯你的班。因此,在這種情況下,編譯器不知道從哪個實例獲取變量,除非您明確指定。

你當然可以讓你的變量成爲靜態的,但是不用爲每個實例設置一組值,不管你創建了多少個實例,只需要一組變量。在這種情況下,示例中的代碼仍然會編譯並運行(儘管它會/應該產生編譯器警告),但是這兩個語句都會打印'2',因爲每個變量只有一個s變量而不是一個類的實例。

+0

aroth的回覆非常有助於可視化差異。謝謝。 – user1837224

相關問題