无法对非静态方法进行静态引用

时间:2014-02-17 21:00:41

标签: java static-methods

到目前为止,我有以下代码:

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(); 
}

}

当我尝试在最后设置double value=getCurrentValue();时,我收到一条错误消息“无法对非静态方法进行静态引用”。它说修复是为了使getCurrentValue()方法也是静态的,但我被告知不要让我的教授将该字段设为静态。有一个简单的解决方案,我只是错过了吗?

5 个答案:

答案 0 :(得分:9)

静态方法属于该类,非静态方法属于该类的实例

当您从getCurrentValue()致电main时,会收到错误,因为main与任何实例都没有关联。

您需要创建该类的实例:

HallLanceMemoryCalculator me = new HallLanceMemoryCalculator();

然后你可以调用实例的getCurrentValue()

double value = me.getCurrentValue();

答案 1 :(得分:5)

静态意味着整个类都有一个,而如果它是非静态的,则每个类(对象)实例都有一个静态。为了从静态上下文引用非静态方法,您需要首先为该方法创建一个对象作为其一部分。因此,在main方法(静态上下文)中,您需要创建一个新的HallLanceMemoryCalculator对象。获得对象后,可以使用对象的方法。

您的教授不希望它是静态的原因是,您可以拥有多个HallLanceMemoryCalculator实例,每个实例都跟踪它们自己的值。

注意,我没有包含任何代码,因为我相信你的教授会希望你自己弄清楚那部分。

答案 2 :(得分:1)

方法getCurrentValue()被定义为类的ordniary(非静态)方法。为了执行它,您需要一个HallLanceMemoryCalculator实例。

所以首先尝试实例化HallLanceMemoryCalculator:

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

为了说明一点,该示例应该有一个用于存储初始值的构造函数。例如。

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

这样做,您可以使用以下主要代码:

    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();

答案 3 :(得分:0)

创建HallLanceMemoryCalculator的实例,然后致电getCurrentValue()或将getCurrentValue()设为静态。

答案 4 :(得分:-1)

如果要在不设置属性static的情况下调用getter函数,则应使用类的实例而不是类。