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

Java 无法对非静态方法进行静态引用,java,static-methods,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){

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

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(); 
}
import java.util.Scanner;
公共类记忆计算器{
私有双电流值;
公共静态int displayMenu(){
扫描仪输入=新扫描仪(System.in);
int-choice=0;
而(选择5){
System.out.println(“1.Add”);
System.out.println(“2.Subtract”);
System.out.println(“3.乘法”);
System.out.println(“4.Divide”);
System.out.println(“5.Clear”);
System.out.println(“您想做什么?”);
choice=input.nextInt();
}
回报选择;
}
公共静态双GetOperator(字符串提示){
扫描仪输入=新扫描仪(System.in);
System.out.println(“第二个数字是什么?”);
double secondNumber=input.nextDouble();
返回第二个号码;
}
公共双getCurrentValue(){
返回当前值;
}
公共void add(双操作数2){
currentValue+=操作数2;
}
公共空减法(双操作数2){
currentValue-=操作数2;
}
公共无效乘法(双操作数2){
currentValue*=操作数2;
}
公共无效除法(双操作数2){
currentValue/=操作数2;
}
公共空间清除(){
currentValue=0;
}
公共静态void main(字符串[]args){
双值=getCurrentValue();
}
}


当我试图设置double
value=getCurrentValue()时最后,我收到一条错误消息“无法对非静态方法进行静态引用”。它说修复方法是将
getCurrentValue()
方法也设置为静态,但我的教授告诉我不要将该字段设置为静态。有没有一个简单的解决方案是我刚刚缺少的?

创建一个
HallLanceMemoryCalculator
的实例,然后调用
getCurrentValue()
或使
getCurrentValue()
静态。

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

main
调用
getCurrentValue()
时,会出现错误,因为
main
与任何实例都没有关联

您需要创建类的实例:

HallLanceMemoryCalculator me = new HallLanceMemoryCalculator();
然后可以调用实例的
getCurrentValue()


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

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

请注意,我没有包含任何代码,因为我相信您的教授希望您自己解决这一部分。

方法getCurrentValue()被定义为该类的一个常规(非静态)方法。为了执行它,您需要一个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();

如果要调用getter函数而不设置属性
static

,则应该使用类的实例,而不是类的实例,但我的教授告诉我不要将该字段设置为静态的,因此,替代方法是…?有关静态引用和非静态成员的信息,检查此页面右侧的“相关”下。创建一个实例。我有点想把它命名为
me
MyClass me=newmyclass();double value=me.getCurrentValue()
@user322816-在任何人为你回答这个问题之前,他们需要知道-你知道“静态”实际上是什么意思吗?如果你这样做了,答案应该是显而易见的。如果你不这样做,我建议你阅读你的课程笔记或在线Java教程。我同意with@DavidWallace. 创建一个实例并使用该对象从静态上下文访问非静态方法或变量<代码>HallLanceMemoryCalculator c=新HallLanceMemoryCalculator();double value=c.getCurrentValue()
    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();