我是Java的新手,只是对代码摆弄了一段时间。
public class ThreeVector {
private double x,y,z; // definign local variables
public ThreeVector(){} // a constructor that has no input
public ThreeVector (double va1,double va2, double va3){va1=x;va2=y;va3=z;};// creatign a constructor , so can be used for calling by a method later
// Takes 3 values
public double magnitude (){
double y1= Math.sqrt(x*x+y*y+z*z);
return y1 ; // finds the magnitude of a vector
}
public ThreeVector unitv(){
ThreeVector unitv= new ThreeVector ();
unitv.ThreeVector(x/magnitude(),y/magnitude(),z/magnitude());
}
现在这是我卡住的地方。我创建了一个对象
unitV
,因此可以调用ThreeVector
构造函数,但是编译器一直在说要为ThreeVector
创建新方法。不确定发生了什么...
最佳答案
只能使用new
关键字调用构造函数。您在这里做什么:
unitv.ThreeVector(x/magnitude(),y/magnitude(),z/magnitude());
正在调用名为
ThreeVector
的方法,因此编译器会抱怨ThreeVector
类中没有此类方法。要解决此问题,必须使用
ThreeVector
构造函数和参数来创建unitv
实例:public ThreeVector unitv(){
ThreeVector unitv = new ThreeVector(x/magnitude(),y/magnitude(),z/magnitude());
//and, of course, return this ThreeVector instance
return unitv;
}
这段代码可以简化为
public ThreeVector unitv() {
return new ThreeVector(x/magnitude(),y/magnitude(),z/magnitude());
}
但是,由于可以同时具有
x
值的y
,z
和0
,因此最好更改unitv
方法中的逻辑以首先获取magnitude
值,然后在进行评估时,这是为了避免被0除:public ThreeVector unitv() {
double magnitude = magnitude();
if (magnitude != 0) {
return new ThreeVector(x/magnitude, y/magnitude, z/magnitude);
}
return new ThreeVector(0, 0, 0);
}
顺便说一句,您的构造函数逻辑是错误的,您正在将字段值分配给参数,应该采用相反的方法:
public ThreeVector (double va1,double va2, double va3) {
x = va1;
y = va2;
z = va3
}