2016-09-17 123 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),这仍然是一个问题?谢谢你的帮助。作为初学者,我非常感激。 –