2013-07-31 60 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

相關問題