2016-09-17 131 views
-7

我試圖寫有多個構造函數的類的toString方法:重載ToString方法

public Fraction(int n1, int d1, int n2, int d2) 
{ 
    num1=n1; 
    den1=d1; 
    num2=n2; 
    den2=d2; 
} 

public Fraction(int nAns, int dAns) 
{ 
    nAnswer=nAns; 
    dAnswer=dAns; 
} 

然而,當我嘗試寫一個toString,我一直(可能是因爲這兩種方法都稱爲toString):

public String toString() 
{ 
    return "Fraction[numerator1="+num1+", numerator2="+num2+", denominator1="+den1+", denominator2="+den2+"]"; 
} 

public String toString() 
{ 
    return "Fraction[nAnswer="+nAnswer+", dAnswer="+dAnswer+"]"; 
} 

如果我命名爲toString方法toString和另一個toString2,程序編譯但沒有給我toString2所需的輸出。所以我然後試着寫這個方法的if語句,但我不知道如何寫if部分(我怎麼說「如果你的分數看起來像第一個構造函數,返回第一個toString;如果你的分數看起來像第二個構造函數,返回第二個toString「?)。

我嘗試以下,但我知道,如果部分是錯誤的,因爲我不斷收到編譯錯誤:

if Fraction==Fraction(int num1, int den1, int num1, int den2) 
{ 
    public String toString() 
    { 
     return "Fraction[numerator1="+num1+", numerator2="+num2+", denominator1="+den1+", denominator2="+den2+"]"; 
    } 
else if Fraction==Fraction(int nAnswer, int dAnswer) 
{ 
    public String toString() 
    { 
     return "Fraction[nAnswer="+nAnswer+", dAnswer="+dAnswer+"]"; 
    } 
} 

但我知道,一個重載的toString方法是可行的,因爲這麼多的類Java庫使用它(例如,Rectangle類)。

有什麼建議嗎?提前致謝!

+1

代碼中至少有10個編譯器錯誤。 –

+0

正如我在我的文章中提到的,我知道我的代碼有編譯錯誤,即在if語句中。但是,由於我仍然是初學者程序員,我不知道如何解決這些錯誤。我需要幫助的主要部分是如何編寫if語句,以便它說明我在上面引用中提到的內容。 –

+1

至少給編譯器錯誤 - 並試圖理解。 –

回答

-1

首先,toString方法來自對象類,不要試圖使這些方法的多個或類似的東西,在一個方法中的一切。至於你的問題,你可以爲你的類創建一個變量String description,並在構造函數中初始化它,然後在toString中返回該變量。你可以做到這一點,如果你沒有改變你的對象任何其他方式創建後,但可能並非如此。您也可以創建兩個布爾變量createdByFirstConstructorcreatedBySecondConstructor並用false初始化它們。然後在兩個構造函數中將改變的變量改爲true,然後在toString中檢查哪個變量設置爲true並相應地打印。希望這可以幫助。有可能更簡單的解決方案,但現在不是我想到的,也許以後。

private boolean createdByFirst = false; 
private boolean createdBySecond = false; 

public Fraction(yourCode){ 
    createdByFirst = true; 
} 

public Fraction(yourOtherCode){ 
    createdBySecond = true; 
} 

public String toString(){ 
    if(createdByFirst) 
    return "yourStringForFirstConstructor"; 
    else if(createdBySecond) 
    return "yourStringForSecondConstructor"; 
    else 
    return "Something else"; 
} 
+0

謝謝!我會試試這個 –

+0

更新:我剛剛嘗試了這段代碼,雖然我仍然遇到編譯錯誤,但至少這是一個我可以玩的起點。再次感謝! –

1

當你的老師叫你去嘗試,看你怎麼可以模擬兩種不同的分數,他們不是故意要嘗試用兩個構造和兩個完全不相干的集合成員的補習班都實現在同一類變量。這與飛行烤麪包機一樣有意義。

你的老師希望你證明你已經知道如何創建一個基類Fraction類,它定義了一個分數的接口而沒有任何實現,然後編寫兩個子類(查找關鍵字extends)方式,另一種做分數不同的方式。每個子類都有它自己的構造函數,它自己的一組成員變量,當然它有自己的方法toString(),所以一切都會好的。

+0

我完全理解你在說什麼。最初的任務是創建一個基礎Fraction類。但是,由於我在初學者的編程課上,我的老師將這個任務修改爲我上面的版本(分子和分母都在同一個構造函數中)。不管怎麼說,還是要謝謝你! –

+0

在同一構造函數中的分子和分母是一回事。由一個構造函數初始化的一組成員變量以及由另一個構造函數初始化的一組不相關的成員變量完全是另一回事。 –

+0

我明白你現在在說什麼。我第一次誤解了你的評論。對不起,如果這聽起來像一個愚蠢的問題,但如果我的第二組變量(nAnswer和dAnswer)從方法類中的第一組變量(num1,den1,num2,den2)派生(例如:nAnswer = num1 * den2 + num2 * den1),這仍然是一個問題?謝謝你的幫助。作爲初學者,我非常感激。 –