非静态变量/方法不能从静态上下文中引用!问题是什么?

时间:2014-02-18 14:40:21

标签: java object methods constructor static

import java.util.Scanner;
import java.lang.Math;

public class Assignment1{
         //instance variables
         double a;
     double b;
     double c;
    // method
    public double hypot(double x, double y){
        x = x*x;
        y = y*y;
        double z = x+y;
        z = Math.sqrt(z);
        return z;

    }
    // constructor
    public Assignment1(double a , double b, double c){
            this.a = a;
        this.b = b;
        this.c = c;
    }

    public static void main(String [] args){ // execution starts from here
            Assignment1 obj = new Assignment1(a,b,c);
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the values to compute the pythagoras    theorem");

        obj.a = in.nextDouble();
        obj.b = in.nextDouble();
        obj.c = hypot(a,b);
        System.out.println("The hypot is"+ c);


    }


}

这段代码有什么问题...我正在创建对象......那么它应该很好!!不是吗???

4 个答案:

答案 0 :(得分:1)

您应该为Assignment创建一个新课程。在这里使用main方法有点令人困惑。也就是说,问题在于main方法的第一行:

Assignment1 obj = new Assignment1(a,b,c);

访问变量abc,它们是非静态变量。这意味着它们不存在于static main函数的上下文中。

另一种写这个的方法是:

// Place this in a file called Assignment.java
import java.util.Scanner;
import java.lang.Math;

public class Assignment {

  double a;
  double b;
  double c;

  public double hypot(double x, double y) {
    x = x*x;
    y = y*y;
    double z = x+y;
    z = Math.sqrt(z);
    return z;
  }

  public Assignment(double a , double b, double c) {
    this.a = a;
    this.b = b;
    this.c = c;
  }

} // end class Assignment

// Place this in a file called Main.java
public class Main {
  public static void main(String [] args){ // execution starts from here

    // Give some values to a, b, and c!
    double a = 1;
    double b = 1;
    double c = 1;

    Assignment obj = new Assignment(a,b,c);
    Scanner in = new Scanner(System.in);
    System.out.println("Enter the values to compute the pythagoras    theorem");

    obj.a = in.nextDouble();
    obj.b = in.nextDouble();
    obj.c = hypot(a,b);
    System.out.println("The hypot is"+ c);
  } // end method main
} // end class Main

作为一般经验法则,请尝试将主类留空除main方法之外的所有内容。如果您调用包含main方法public class Main的类,则会更加清晰。希望这有帮助!

答案 1 :(得分:1)

在您的main方法(static)中,您尝试访问非{1}} ab字段而非任何参考到c实例。

您需要了解类的非静态成员属于类的实例,并且只能通过此类实例进行访问。

在非静态方法中,如

Assignment1

您可以在不引用实例的情况下使用void someMethod(){ field = 42; } ,因为编译器会为您添加field代表当前实例的变量。在静态方法中没有this.,因为静态方法/字段属于整个类,而不属于实例。

要解决您的问题,请考虑首先创建Assignment1类的“未设置”实例(假设您将其值设置为this),例如

0

然后您可以将其字段设置为来自用户的数据,如

Assignment1 obj = new Assignment1(0, 0, 0);

最后,您可以使用

计算obj.a = in.nextDouble(); obj.b = in.nextDouble();
c
BTW直接操纵物场是考虑不好的设计。相反,你应该创建getter和setter(像obj.c = obj.hypot(obj.a, obj.b); getA()这样的方法)来返回或操纵它们的值。

答案 2 :(得分:1)

abc实例成员。您main方法是成员。

你试图混合两者,这是行不通的。

此外,由于您并不真正需要Assignment1课程的自定义构造函数,因此您可以删除

相反,尝试这样的事情:

public static void main(String [] args){ // execution starts from here
        Assignment1 obj = new Assignment1();
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the values to compute the pythagoras    theorem");

        obj.a = in.nextDouble();
        obj.b = in.nextDouble();
        obj.c = hypot(a,b);
        System.out.println("The hypot is"+ c);
 }

答案 3 :(得分:1)

当然是错的, 首先使用这些代码创建Assignment1的实例: Assignment1 obj = new Assignment1(a,b,c);

其中a和b以及c ??

也许你应该首先使用null: Assignment1 obj = new Assignment1(null,null,null);

然后使用Scanner.in初始化a,b和c