【问题标题】:non-Static method toString cannot be referenced from a static context不能从静态上下文引用非静态方法 toString
【发布时间】:2014-12-21 19:02:44
【问题描述】:

我正在尝试创建一个程序来读取用户输入并存储它,然后计算多边形的面积。当我尝试编译它时,它给了我一个错误,即.toString 是非静态的。

import java.util.Scanner;

class regularpoTest {
    public static void main(String[] args) {
    
        Scanner in = new Scanner(System.in);
        boolean finished = false;
        double s;
        double n;
        double area;
        //starts loop to record data
        do {
            s =0;
            n =0;
        
        
            System.out.println("Enter the side length, or anything else to quit: ");
            s = in.nextDouble();
            in.nextLine();
            if (in.hasNextDouble()) {
                System.out.println("Enter number of sides");
                n = in.nextDouble();
                area = (s*s*n)/(4*Math.tan(Math.PI/n));
            } else {
                finished = true;
            
            }
        } while(!finished);
    
        //This prints out the student details 
    
        System.out.println(regularpo.toString());
    
    }
}  

public class regularpo {

    private double side;
    private double numberOf;
    private double area;
    
    public regularpo(double side, double numberOf){
        side = 0;
        numberOf = 0;
        area = 0;
    }
    
    public double getSide(){
        return side;
    }
    public double getNumberOf(){
        return numberOf;
    }
    public String toString(){
        return ("area = " + area+ " side length "+side+ " number of sides "+numberOf);
    }
}

【问题讨论】:

  • 你缺少一个正则po的实例。
  • 按照惯例,类名以大写字母开头。
  • System.out.println(regularpo.toString()); 显然regularpo 是类名,而不是对象引用。 toString 是一个实例方法,这意味着您必须提供 regularpoinstance 才能使用它。而且您似乎没有在任何地方创建regularpo 的实例,所以没有其他东西可以使用。
  • 而且,正如 Eliot 所说,类名应该以 UpperCase 字母开头,而变量名应该以 lowerCase 开头。如果您遵守此约定,其他人将更容易理解您的代码。

标签: java static tostring


【解决方案1】:

当该方法已被定义为(并且仅作为)该类的实例的方法时,您正试图调用该类的方法。也许你的意思是创建那个类的一个对象,然后调用它的 toString 方法,虽然我不能从你的代码中确定。

【讨论】:

    【解决方案2】:

    您不能使用classname.nonStaticMethodName 访问非静态方法。您需要使用 new 关键字来实例化您的对象。基本上,您通过regularpo r = new regularpo(2.0, 2.0) 创建对象的实例。之后你可以调用r.toString();

    查看此SO-question 了解更多信息。

    这个Oracle-tutorial很好地解释了班级成员。

    【讨论】:

      【解决方案3】:

      建议:

      1) 消除“regularpoTest”。只需将“main()”移动到“regularpo”即可。

      2) 大写“RegularPo”(按照惯例,类名应以大写字母开头)。

      3) 让 RegularPo 构造函数真正保存初始值(不仅仅是将它们设置为零)。

      ...还有,最重要的...

      4) 你的主程序应该调用RegularPo regularPo = new RegularPo (...)。 然后引用对象实例“regularPo”。

      【讨论】:

      • 嗨!感谢您的帮助我唯一不明白的是第 4 点......我应该把你写的东西放在我的主类(regularpoTest 对吗?)但是你参考实例 regularPo 是什么意思?忍受我刚刚开始这一切;)
      【解决方案4】:

      尝试创建一个 regularpo 类的对象并在该对象上调用 toString

      regularpo obj=new regularpo();
      obj.toString();
      

      根据惯例,类名必须以大写开头,所以将你的类命名为Regularpo

      【讨论】:

        【解决方案5】:

        toString() 是 regularpro 类中的一个非静态方法,我们知道非静态属于一个对象,所以我们需要创建和对象同一个类并调用它。

        toString() 属于 Object 类,所以它的非静态方法。

        regularpo obj=新的regularpo(); obj.toString();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-22
          • 2023-03-31
          • 2013-04-05
          相关资源
          最近更新 更多