2014-12-21 119 views
-3

我试图创建一个程序读取用户输入并存储它,然后计算多边形的面积
当我尝试编译它时,它给了我一个错误至极约.toSting是非静态非静态方法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); 
    } 
} 
+1

你错过了regularpo的一个实例。 – Eric

+2

按照惯例,类名以大写字母开头。 –

+1

'System.out.println(regularpo.toString());'显然'regularpo'是一个类名,而不是对象引用。 'toString'是一个实例方法,这意味着你必须提供'regularpo'的*实例*来使用它。而且你似乎没有在任何地方创建'regularpo'的实例,所以没有别的可用的。 –

回答

1

您试图调用类,当方法已经用于定义(也是唯一有意义的,因为)的方法的一个该类的一个实例的方法。也许你的意思是创建该类的对象,然后调用它的toString方法,尽管我无法从代码中确定它。

1

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

查看这个SO-question欲了解更多信息。

这个Oracle-tutorial很好地解释了类的成员。

1

意见建议:

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

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

3)使RegularPo构造函数实际上保存初始值(不只是将它们设置为零)。

...而且,最重要的...

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

+0

嗨! 谢谢你的帮助我唯一不明白的地方是第4点......我应该把我的主类(regularpoTest正确?)你写的是什么,但是你的意思是指什么regularPo实例? 熊与我刚刚开始这一切;) –

0

尽量让regularpo类的对象,并调用toString在该对象

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

而且按照约定的类名必须以大写字母开始,所以命名类为Regularpo

0

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

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

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

相关问题