Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAVA cannot make a static reference to non-static field

Tags:

java

this is my first program in JAVA and I'm having problem to understand this error

Cannot make a static reference to the non-static field *

and

Cannot make a static reference to the non-static method *

public class Cerchio{

   float r;
   float area;
   float cfr;
   final double pi = 3.14;

   public static void main(String[] args){
      System.out.println("CIRCLE PROGRAM\n");
      r = 5;
      c_cfr();
      c_area();
      System.out.ptintln("The cir is: " + cfr);
      System.out.println("The area is: " + area);
   }

   float c_cfr(){
      cfr =(float)(2 * pi * r); //casting
      return cfr;
   }

   float c_area(){
      area = (float)(pi * (r*r));
      return area;
   }

}

errors Can you give me any suggest? I'm coding on SandIDE on Android

like image 220
Mitro Avatar asked Oct 20 '13 20:10

Mitro


People also ask

Can we make static reference to non-static field?

i.e. referring a variable using static reference implies to referring using the class name. But, to access instance variables it is a must to create an object, these are not available in the memory, before instantiation. Therefore, you cannot make static reference to non-static fields(variables) in Java.

Can static methods reference non-static variables Java?

In the static method, the method can only access only static data members and static methods of another class or same class but cannot access non-static methods and variables.

How do you make a non-static reference in Java?

That is the reason why non-static field or method can not be called from the static context. The obvious solution to fix "Cannot make a static reference to the non-static method or a non-static field" error in Java is to create an instance of the class and then access the non-static members.

Why can't a static method refer to non-static members of the class?

Non-static variables are part of the objects themselves. To use a non-static variable, you need to specify which instance of the class the variable belongs to. But with static methods, there might not even be any instances of the class. (For example, the static methods in Math run without instantiating a Math object.)


1 Answers

You are calling instance methods and fields from within a static method, something that can't be done because instance fields and methods don't exist without an object, and inside of the main method there is not this object. You must instead create an instance of the class, and then call the methods on the instance.

public class Cerchio{

  float r;
  float area;
  float cfr;
  final double pi = 3.14;

  public static void main(String[] args){
    System.out.println("CIRCLE PROGRAM\n");

    Cerchio cerchio = new Cerchio();
    cerchio.r = 5;
    cerchio.c_cfr();
    cerchio.c_area();
    System.out.ptintln("The cir is: " + cerchio.cfr);
    System.out.println("The area is: " + cerchio.area);
  }

  float c_cfr(){
    cfr =(float)(2 * pi * r); //casting
    return cfr;
  }

  float c_area(){
    area = (float)(pi * (r*r));
    return area;
  }

}

Lots of other problems,...

  • You're accessing class fields directly, something that shouldn't be done. Instead, the fields should be private and you should use getters/setters/contructor parameters to get, set and set the fields.
  • Your code is unindented making it very hard to read and understand.

Please search this site as this same question has been asked and answered a gabizillion times, and most likely there's an answer out there that is much better than mine. If found, then this question should be closed as a duplicate.


Edit
You state:

I didn't understand "Instead, the fields should be private and you should use getters/setters/contructor parameters to get, set and set the fields." I should write private float c_cfr() ?

Your fields are:

float r;
float area;
float cfr;

This is really not a field but a constant: final double pi = 3.14;

and can be replaced / improved by simply using Math.PI.

Your fields should be changed to:

private float r;
private float area;
private float cfr;

and you should only access them via public getter and setter methods, and only if absolutely necessary.

like image 103
Hovercraft Full Of Eels Avatar answered Oct 05 '22 22:10

Hovercraft Full Of Eels