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);
}
}
这段代码有什么问题...我正在创建对象......那么它应该很好!!不是吗???
答案 0 :(得分:1)
您应该为Assignment
创建一个新课程。在这里使用main
方法有点令人困惑。也就是说,问题在于main
方法的第一行:
Assignment1 obj = new Assignment1(a,b,c);
访问变量a
,b
和c
,它们是非静态变量。这意味着它们不存在于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}} a
和b
字段而非任何参考到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)
a
,b
和c
是实例成员。您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