【问题标题】:JAVA cannot make a static reference to non-static fieldJAVA 不能对非静态字段进行静态引用
【发布时间】:2013-10-20 20:52:48
【问题描述】:

这是我在 JAVA 中的第一个程序,我无法理解这个错误

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

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

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

}

你能给我什么建议吗? 我在 Android 上的 SandIDE 上编码

【问题讨论】:

    标签: java


    【解决方案1】:

    您正在从静态方法中调用实例方法和字段,这是无法完成的事情,因为实例字段和方法在没有对象的情况下不存在,并且在主方法内部没有this 对象。您必须改为创建该类的实例,然后调用实例上的方法。

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

    还有很多其他问题,...

    • 您正在直接访问类字段,这是不应该做的事情。相反,字段应该是私有的,您应该使用 getters/setters/constructor 参数来获取、设置和设置字段。
    • 您的代码没有缩进,因此很难阅读和理解。

    请搜索这个网站,因为同样的问题已经被问及回答了无数次,而且很可能有一个比我更好的答案。如果找到,那么这个问题应该作为重复关闭。


    编辑
    你说:

    我不明白“相反,字段应该是私有的,您应该使用 getters/setters/contructor 参数来获取、设置和设置字段。”我应该写 private float c_cfr() 吗?

    您的字段是:

    float r;
    float area;
    float cfr;
    

    这实际上不是一个字段,而是一个常量: 最终双 pi = 3.14;

    并且可以通过简单地使用 Math.PI 来替换/改进。

    您的字段应更改为:

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

    并且您应该只通过公共 getter 和 setter 方法访问它们,并且只有在绝对必要的情况下。

    【讨论】:

    • 好的,所以我需要在类中创建对象,我必须使用类中声明的属性和方法,对吧?
    • @AlessioMTX:见编辑回答。您必须在 main 方法中创建一个 Cerchio 类型的变量并为其分配一个新的 Cerchio 对象,然后您可以调用该变量的方法。这一切都应该在你的教科书关于对象创建的章节中得到很好的解释。请看一看。
    • 好的,谢谢,这是一个愚蠢的错误,但我需要像你这样的解释。我修复了代码,所以现在很容易阅读,虽然不正确。
    • 我不明白“相反,字段应该是私有的,您应该使用 getters/setters/contructor 参数来获取、设置和设置字段。”我应该写 private float c_cfr() ??
    【解决方案2】:

    简单的解决方法是将静态一词放在每个方法的前面。这是一个普遍的静态真理圆周 =2pi*r 你的圈子可能比我的圈子大(两个圆实例)但是要找到面积有一个公式

    【讨论】:

      【解决方案3】:

      c_cfr() 和 c_area() 是您尝试直接从静态 main 方法调用的非静态方法。要么将 c_cfr() 和 c_area() 方法设为静态方法,要么使用对象引用访问它们。

      【讨论】:

        【解决方案4】:

        在此代码中,您试图在静态方法中访问类的非静态实例和方法,即 public static void main(String[] args)

        所以,将实例和方法更改为静态或创建 Cerchio 的对象,然后访问它们

        public class Cerchio {
        
               static float r;
               float area;
               float cfr;
               
               static  float c_cfr() {
                  return (float)(2 * Math.PI* r);
               }
        
               float c_area() {
                  area = (float)(Math.PI * (r*r));
                  return area;
               }
        
               public static void main(String[] args){
                  System.out.println("CIRCLE PROGRAM\n");
                  Cerchio.r = 5;
               
                  Cerchio s = new Cerchior();
                  
                  System.out.println("The cir is: " +c_cfr());
                  System.out.println("The area is: " + s.c_area());
               }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多