cannot make a static reference to a non static method

So far I have the following code:

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

}

When I try to set double value=getCurrentValue(); at the end, I get an error message "Cannot make a static reference to the non-static method." It says the fix is to make the getCurrentValue() method static as well, but I was told not to make that field static by my professor. Is there a simple solution to this that I am just missing?


Solution 1:

A static method belongs to the class, a non-static method belongs to an instance of the class.

When you call getCurrentValue() from main, you get an error because main isn't associated with any instance.

You need to create an instance of the class:

HallLanceMemoryCalculator me = new HallLanceMemoryCalculator();

Then you can call the instance's getCurrentValue():

double value = me.getCurrentValue();

Solution 2:

Static means there is one for an entire class, whereas if it is non-static there is one for each instance of a class (object). In order to reference a non-static method from a static context, you need to first create an object for that method to be a part of. So, in your main method (the static context), you need to create a new HallLanceMemoryCalculator object. Once you have the object, you can use the object's methods.

The reason your professor does not want it to be static, is so that you have the ability to have multiple HallLanceMemoryCalculator instances, that each keep track of their own value.

Note, I'm not including any code, because I'm sure your professor would want you to figure out that part on your own.

Solution 3:

The Method getCurrentValue() is defined as an ordniary (non-static) method of the class. In order to execute it, you need an instance of HallLanceMemoryCalculator.

So try to instantiate HallLanceMemoryCalculator first:

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

In order to make some sense, the example should have a constructor for storing the initial value. E.g.

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

In doing so, you can use the following main code:

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