2012-01-04 105 views
1

任何人都可以向我解釋,爲什麼我不被允許執行以下操作?非靜態方法來自非靜態參考錯誤。簡單的程序

public class first_class { 

    int grade1=7; 
    int grade2=4; 

    double average; 

    public double calcAverage() { 
     average=(grade1+grade2)/(2); 
     System.out.println(average); 
     return average; 
    } 

    public static void main(String []args) { 
     first_class.calcAverage(); 
    } 
} 

我得到的錯誤消息「非靜態方法calcAverage()不能從靜態上下文在first_class.main(first_class.java:17)引用」。

回答

2

試試這個:

new first_class().calcAverage(); 

什麼這是首先創建first_class類的新實例,然後在該實例上調用calcAverage()方法。現在,您正在引用實例上的方法,而不是試圖靜態引用它。

該錯誤是指示您從靜態方法(main()方法)嘗試引用沒有實例的方法。如果方法標記爲靜態,但是您的calcAverage()未標記爲靜態,則可以執行此操作,所以您需要改爲創建一個實例。

+1

修正了它。對不起,打字速度很快。 – rfeak 2012-01-04 01:59:52

1

您尚未實例化first_class的實例。

這是在你的previous question討論,我的回答有第一款仍持有:)(如由於我關於Java的命名約定評論。)

+0

我需要一個關於如何在main中做的例子,這引起了一些問題,但是謝謝,我現在明白它更好了 – John 2012-01-04 02:12:44

+0

@John它不是'main'/not -'main';你可以使用'main'的靜態或實例方法。 – 2012-01-04 02:13:20

0
public static void main(String[] args) 
{ 
    first_class f=new first_class(); 
    f.calcAverage(); 
} 

該方法不是靜態的。您必須按照上述first_class的對象訪問它。此外,您不遵循Java命名約定。班級名稱應該是FirstClass而不是first_class


如果您想通過名稱訪問方法,您的代碼應如下所示。

package temp; 

final class first_class 
{ 
    static int grade1=7; 
    static int grade2=4; 

    static double average; 
    public static double calcAverage() 
    { 
     average=(grade1+grade2)/(2); 
     System.out.println(average); 
     return average; 
    } 
} 

final public class Main 
{ 
    public static void main(String[] args) 
    { 
     first_class.calcAverage(); 
    } 
} 

使該聲明的字段類static內,因爲在Java靜態方法只能有靜態成員(字段或方法)的訪問,你就可以使用靜態方法來訪問它們如前面提到的片段。

+0

我試圖執行它的標準方式,但謝謝你的其他解決方案 – John 2012-01-04 02:09:50

+1

@John沒有「標準」;兩者都是合法的。要使用哪個取決於您的需求。 – 2012-01-04 02:12:12

+0

迄今爲止我們還沒有看到'final'的用法,所以我認爲它不太標準,但我猜不是。對困惑感到抱歉。 – John 2012-01-04 02:17:41