从构造函数创建对象

时间:2013-07-31 17:10:32

标签: java

我是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创建一个新方法。 不确定最新情况......

3 个答案:

答案 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());
}

但由于您可以同时拥有xyz 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;
}