2011-01-23 51 views
4

美好的一天!初學Java - 靜態錯誤

我是Java的初學者。我不能編譯下面的代碼:出現

public class Test { 
public static void main (String [] args){ 
    int a = calcArea(7, 12); 
    System.out.println(a); 
} 

int calcArea(int height, int width) { 
    return height * width; 
} 
} 

以下錯誤:

Non-static method calcArea(int, int) cannot be referenced from static content

是什麼意思?我該如何解決這個問題..?

您的答覆將不勝感激。 謝謝您的建議基於

,我做了一個實例,它是新的測試()如下:

public class Test { 
    int num; 
    public static void main (String [] args){ 
     Test a = new Test(); 
     a.num = a.calcArea(7, 12); 
     System.out.println(a.num); 
    } 

    int calcArea(int height, int width) { 
      return height * width; 
    } 

} 

這是正確的嗎?有什麼區別,如果我這樣做...

public class Test { 
public static void main (String [] args){ 
    int a = calcArea(7, 12); 
    System.out.println(a); 
} 

static int calcArea(int height, int width) { 
    return height * width; 
} 
} 
+0

關於你的編輯:第一,`calcArea`是一個實例方法,它在一個對象上被調用,並且(通常)執行與該對象相關的操作。第二個使`calcArea`成爲靜態(類)方法,它(通常)通常僅執行沒有任何對象實例的動作。在這裏,`calcArea`在它的參數上工作,返回一個結果,這對於類方法來說很好。現在在一個名爲`calcArea()`(無參數)的實例方法名爲Rectangle的類中,您可以看到它是如何乘以自己的高度和寬度成員變量以返回特定於對象的結果。 – 2011-01-23 15:49:02

回答

4

Nanne建議的絕對是解決您的問題。不過,我認爲如果你現在習慣了這種習慣,在你學習java的過程中儘早嘗試儘可能少地使用靜態方法會比較謹慎(除非適用)(例如,實用方法) 。這裏是你的代碼修改,以創建測試的一個實例,並調用油杉方法測試對象上:

public class Test { 
public static void main (String [] args){ 
    Test test = new Test(); 
    int a = test.calcArea(7, 12); 
    System.out.println(a); 
} 

int calcArea(int height, int width) { 
    return height * width; 
} 
} 

正如你在用Java編碼,並進一步得到,想必給你剛剛開始編寫處理代碼通過某種類型的對象(如多邊形對象),像calcArea這樣的方法屬於實例上下文,而不是靜態上下文,因此它可以在對象的內部狀態上運行。這將使你的代碼更加面向對象,程序更少。

7

你的主要是靜態的,所以你可以把它叫做無類測試(new test())的一個實例。但它調用calcArea這不是一個靜態的:它需要的類的實例

你可以重寫它像這樣我猜:

public class Test { 
public static void main (String [] args){ 
    int a = calcArea(7, 12); 
    System.out.println(a); 
} 

static int calcArea(int height, int width) { 
    return height * width; 
} 
} 

正如評論指出,和其他的答案也顯示,你可能不想要通過這條路線來實現evertyhing:你將只獲得靜態函數。找出你的代碼中的靜態應該是什麼,也許讓自己成爲一個對象並從那裏調用函數:D

+0

這是真的,但這種方式初學者結束所有方法是靜態的。那很糟。我建議儘快離開靜態環境,像`public static void main(String [] args){new Test()。go(args);}` – maaartinus 2011-01-23 15:07:16

+0

true,@maaartinus,但沒有上下文程序很難猜測什麼是地點和原因。但@newbie確實可以檢查出來。 – Nanne 2011-01-23 15:09:19

1

你知道靜態方法是什麼嗎?

如果沒有,請查看它,但簡單的答案是靜態方法不能(不能)訪問「this」,因爲它沒有分配給任何特定的類實例。因此,您無法從靜態方法中調用實例方法(非靜態方法),因爲計算機將如何知道該方法應在哪個實例上運行?

+0

相當不錯的答案,不知道它是否真的值得downvoting。 – Rekin 2011-01-23 14:58:36

4

calcArea一定不能是靜態的。要在主類中使用其他方法,您必須創建其實例。

public class Test { 
public static void main (String [] args){ 
    Test obj = new Test(); 
    int a = obj.calcArea(7, 12); 
    System.out.println(a); 
} 

int calcArea(int height, int width) { 
    return height * width; 
} 
} 
1

如果一個方法被定義爲靜態的,這意味着你可以調用在類名的方法,如:

int a = Test.calcArea(7, 12); 

,而無需創建一個對象,

這裏; 測試是類的名稱,但要這樣做calcArea()方法必須是靜態的,或者您可以通過對象調用非靜態方法;您可以通過一個類實例化,例如創建一個對象:

Test a = new Test(); 

這裏「a」是類型測試的對象,

a.calcArea(7,12); 

可以稱爲如果方法定義爲靜態