我是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
创建一个新方法。
不确定最新情况......
答案 0 :(得分:6)
使用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
值,因此最好更改{{{}中的逻辑1}}首先获取unitv
值并进行评估的方法,这是为了避免除以0:
magnitude
顺便说一句,你的构造函数逻辑是错误的,你将字段值赋给参数,它应该是相反的方式:
public ThreeVector unitv() {
double magnitude = magnitude();
if (magnitude != 0) {
return new ThreeVector(x/magnitude, y/magnitude, z/magnitude);
}
return new ThreeVector(0, 0, 0);
}
答案 1 :(得分:0)
不需要直接调用构造函数:
ThreeVector unitv= new ThreeVector(x,y,z);
只有在此之后你才能调用幅度方法
此外,您的构造函数以错误的方式执行分配:
应该是: public ThreeVector(double va1,double va2,double va3){x = va1; y = va2; z = va3;}
答案 2 :(得分:0)
您需要初始化new ThreeVector(va1, va2, va3)
。
<强>注意强>
构造函数中的代码错误。
{
// instance field assigned to argument
va1=x;va2=y;va3=z;
}
......应该是:
{
// argument assigned to instance field
x = va1;
y = va2;
z = va3;
}