到目前为止,我有以下代码:
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()
方法也是静态的,但我被告知不要让我的教授将该字段设为静态。有一个简单的解决方案,我只是错过了吗?
答案 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函数,则应使用类的实例而不是类。