我是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值的yz0,因此最好更改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
}

10-06 06:02