2013-07-31 188 views
0

我是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

你是如何创建对象?你可以添加试图使用'ThreeVector'的代码吗? –

+0

阅读http://www.javabeginner。com/learn-java/java-constructors – MayurB

+0

你有一个方法定义为'public ThreeVector unitv()...'但不返回ThreeVector的实例。我想你想要移除unitv方法并做一些像Luiggi建议的事情。 – km1

回答

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,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 
} 
+0

ThreeVector unitv = new ThreeVector();我的意思是不是说上面的行是干什么的?对不起,我对我的回答的第一句话中的这个 –

+0

@RobinPhilip完全陌生,我解释说你可以使用'new'关键字调用构造函数。当你执行'unitv.ThreeVector(...)'时,你不是用三个参数调用构造函数,而是调用一个不存在的名为'ThreeVector'的方法,因此编译器给你带来了问题。 –

+0

感谢LUiggi明白了,所有其他:) –

0

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

ThreeVector unitv= new ThreeVector(x,y,z); 

只有在这你可以调用幅度方法

而且你的构造函数的分配错误方式:

应该是: 公共ThreeVector(双VA1,VA2双,双VA3){X = VA1; Y = VA2; Z = VA3;}

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; 
} 
+0

@SotiriosDelimanolis AARGH。谢谢! – Mena

相关问题