2014-02-17 99 views
1

到目前爲止,我有以下代碼:不能讓一個靜態引用非靜態方法

import java.util.Scanner; 

public class HallLanceMemoryCalculator { 
private double currentValue; 

public static int displayMenu(){ 

    Scanner input=new Scanner(System.in); 

    int choice=0; 

    while(choice<1||choice>5){  
    System.out.println("1.Add"); 
    System.out.println("2.Subtract"); 
    System.out.println("3.Multiply"); 
    System.out.println("4.Divide"); 
    System.out.println("5.Clear"); 

    System.out.println("What would you like to do?"); 
    choice=input.nextInt(); 
    } 
    return choice; 
} 

public static double getOperand(String prompt){ 
    Scanner input=new Scanner(System.in); 
    System.out.println("What is the second number?"); 
    double secondNumber=input.nextDouble(); 
    return secondNumber; 
} 

public double getCurrentValue(){ 
    return currentValue; 
} 

public void add(double operand2){ 
    currentValue+=operand2; 
} 

public void subtract(double operand2){ 
    currentValue-=operand2; 
} 

public void multiply(double operand2){ 
    currentValue*=operand2; 
} 

public void divide(double operand2){ 
    currentValue/=operand2; 
} 

public void clear(){ 
    currentValue=0; 
} 

public static void main(String[] args) { 
    double value=getCurrentValue(); 
} 

}

當我嘗試設置雙value=getCurrentValue();末,我得到一個錯誤信息「無法對非靜態方法進行靜態引用。「它說修復方法是使靜態的方法也變爲靜態的,但我被告知不要讓我的教授將這個領域變爲靜態的。有沒有簡單的解決方案,我只是失蹤?

+2

'但我被告知不要讓我的教授把這個領域變成靜態的,因此另一種選擇是......? –

+0

有關靜態引用和非靜態成員的信息,請在「相關」下查看此頁面的右側。 –

+0

創建一個實例。我有點喜歡將它命名爲'me':'MyClass me = new MyClass(); double value = me.getCurrentValue();' –

回答

8

靜態方法屬於該類,非靜態方法屬於該類的實例

當您從main撥打電話getCurrentValue()時,出現錯誤,因爲main未與任何實例關聯。

您需要創建類的實例:

HallLanceMemoryCalculator me = new HallLanceMemoryCalculator(); 

然後你就可以調用該實例的getCurrentValue()

double value = me.getCurrentValue(); 
0

創建您的HallLanceMemoryCalculator的實例,然後致電getCurrentValue()或使getCurrentValue()靜態。

5

靜態意味着有一個對整個類,而如果它是非靜態對於類(對象)的每個實例都有一個。爲了從靜態上下文中引用非靜態方法,您需要先爲該方法創建一個對象。因此,在您的主要方法(靜態環境)中,您需要創建一個新的HallLanceMemoryCalculator對象。一旦你有了這個對象,你就可以使用這個對象的方法。

你的教授不希望它是靜態的原因是,你有能力擁有多個HallLanceMemoryCalculator實例,每個實例都跟蹤自己的價值。

請注意,我不包含任何代碼,因爲我相信您的教授會希望您自己弄清楚這一部分。

1

Method getCurrentValue()被定義爲該類的一個ordniary(非靜態)方法。爲了執行它,你需要一個HallLanceMemoryCalculator的實例。

所以儘量先實例HallLanceMemoryCalculator:

HallLanceMemoryCalculator calc = new HallLanceMemoryCalculator(); 
    double value = calc.getValue(); 

爲了使某種意義上說,比如應該有用於存儲初始值的構造函數。例如。如果你想打電話給你的getter函數沒有設置該屬性

HallLanceMemoryCalculator calc = new HallLanceMemoryCalculator(10); 
    int choice = displayMenu(); 

    // some code to get the second operand (you don't need the string as param) 
    double operand = getOperand(""); 

    // some switch statement to handle the choice 
    ... 

    double result = calc.getCurrentValue(); 
-1

你應該使用類的一個實例,而不是類:

public HallLanceMemoryCalculator(double initial) { 
     this.currentValue = initial; 
    } 

在這樣做時,你可以使用下面的主代碼static

相關問題