【问题标题】:Non-static variable/method cannot be refrenced from static context! What is the prob? [duplicate]不能从静态上下文中引用非静态变量/方法!问题是什么? [复制]
【发布时间】:2014-03-18 09:37:09
【问题描述】:
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);


    }


}

这段代码有什么问题...我正在创建对象...那么它应该可以正常工作!不是吗???

【问题讨论】:

  • 对我来说看起来像是一项编程任务...也许您正试图在静态方法中使用非静态字段?
  • 使用IDE

标签: java object methods constructor static


【解决方案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 的类会更清楚。希望这会有所帮助!

【讨论】:

  • 根据 OOPS 原则有什么问题?如何交替编码?
  • 我添加了另一种编写代码的方法!
【解决方案2】:

在您的main 方法(即static)中,您试图访问a bc 字段,这些字段是非静态的,没有对Assignment1 实例的任何引用。

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

在像

这样的非静态方法中
void someMethod(){
    field = 42;
}

你可以使用field 而不引用实例,因为编译器会为你添加this. 到代表当前实例的变量中。在静态方法中没有this,因为静态方法/字段属于整个类,而不是实例。

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

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

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

obj.a = in.nextDouble();
obj.b = in.nextDouble();

最后你可以使用

计算c
obj.c = obj.hypot(obj.a, obj.b);

顺便说一句,直接操作对象字段被认为是糟糕的设计。相反,您应该创建 getter 和 setter(方法如 getA() setA(int newA)),它们将返回或操作它们的值。

【讨论】:

    【解决方案3】:

    当然错了, 您首先使用这些代码创建一个 Assignment1 实例: 作业 1 obj = 新作业 1(a,b,c);

    a 和 b 和 c 在哪里??

    也许你应该先使用 null: 赋值1 obj = 新赋值1(null,null,null);

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

    【讨论】:

    • 我将 a、b、c 保持为静态,现在它工作正常... :)
    【解决方案4】:

    abcinstance 成员。你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);
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 2013-02-02
      • 2019-03-17
      • 2011-11-30
      相关资源
      最近更新 更多