Java 从构造函数创建对象

Java 从构造函数创建对象,java,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

我是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
创建一个新方法。
不确定发生了什么…

不,您需要直接调用构造函数:

ThreeVector unitv= new ThreeVector(x,y,z);
只有在这之后,您才能调用震级方法

此外,您的构造函数以错误的方式进行赋值:

应该是:
public ThreeVector(double va1,double va2,double va3){x=va1;y=va2;z=va3;}

无需直接调用构造函数:

ThreeVector unitv= new ThreeVector(x,y,z);
只有在这之后,您才能调用震级方法

此外,您的构造函数以错误的方式进行赋值:

应该是:
public ThreeVector(double va1,double va2,double va3){x=va1;y=va2;z=va3;}

只能使用
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());
}
但是,由于您可以同时使用
0
值设置
x
y
z
,因此最好更改
unitv
方法中的逻辑,首先获取
幅值并进行计算,以避免被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
}

只能使用
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());
}
但是,由于您可以同时使用
0
值设置
x
y
z
,因此最好更改
unitv
方法中的逻辑,首先获取
幅值并进行计算,以避免被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
}

您需要初始化一个
新的三向量(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;
}

您需要初始化一个
新的三向量(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;
}

你是如何创建这个对象的?您可以添加尝试使用
ThreeVector
的代码吗?请阅读,您有一个定义为
public ThreeVector unitv()…
的方法,但不返回ThreeVector的实例。我认为你想删除UNITV方法,做一些像LuigGi的建议。作为一个风格,你应该考虑使班级决赛(所以它不能被细分),也可能是其中的双打。如果ThreeVector是不可变的,那么使用ThreeVector类的代码将更容易理解和调试。您必须将无参数构造函数显式设置为'x=0.0;y=0.0;z=0.0'(假设这是无参数版本的意图)。如果您确实决定ThreeVector应该是不可变的,那么可能没有无参数构造函数的意义。顺便说一句,定义一个“公共静态最终ThreeVector ZERO=new ThreeVector(0.0,0.0,0.0);”。现在你有了一个表示“零”向量的常数。你是如何创建这个对象的?您可以添加尝试使用
ThreeVector
的代码吗?请阅读,您有一个定义为
public ThreeVector unitv()…
的方法,但不返回ThreeVector的实例。我认为你想删除UNITV方法,做一些像LuigGi的建议。作为一个风格,你应该考虑使班级决赛(所以它不能被细分),也可能是其中的双打。如果ThreeVector是不可变的,那么使用ThreeVector类的代码将更容易理解和调试。您必须将无参数构造函数显式设置为'x=0.0;y=0.0;z=0.0'(假设这是无参数版本的意图)。如果您确实决定ThreeVector应该是不可变的,那么可能没有无参数构造函数的意义。顺便说一句,定义一个“公共静态最终ThreeVector ZERO=new ThreeVector(0.0,0.0,0.0);”。现在有了一个表示“零”向量的常数。ThreeVector unitv=new ThreeVector();我的意思是,上面这条线不是在做什么吗?对不起,我的无知对我来说是全新的this@RobinPhilip在我回答的第一句话中,我解释说您可以使用
new
关键字调用构造函数。当您执行
unitv.ThreeVector(…)
时,您并没有使用三个参数调用构造函数,而是调用一个名为
ThreeVector
的方法,该方法不存在,因此编译器会给您带来问题。感谢LUiggi获得了它,以及所有其他方法:)ThreeVector unitv=new ThreeVector();我的意思是,上面这条线不是在做什么吗?对不起,我的无知对我来说是全新的this@RobinPhilip在我回答的第一句话中,我解释说您可以使用
new
关键字调用构造函数。当您执行
unitv.ThreeVector(…)
时,您并没有使用三个参数调用构造函数,而是调用一个名为
ThreeVector
的方法,该方法不存在,因此编译器是giv