重载toString方法

时间:2016-09-17 18:57:49

标签: java constructor overloading 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部分是错误的,因为我不断收到编译错误:

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类)。

有什么建议吗?提前谢谢!

2 个答案:

答案 0 :(得分:1)

当你的老师告诉你试着看你如何对两种不同的分数进行建模时,他们并不打算尝试用两个构造函数和两个完全不相关的成员变量集将这两个实现塞入同一个类中。这与飞行烤面包机一样有意义。

您的老师希望您证明您了解如何创建基础Fraction类,该类定义了没有任何实现的分数的接口,然后编写两个子类,(查找extends关键字,)一个分数单向分数,另一个分数以不同的方式分数。每个子类都有自己的构造函数,自己的成员变量集,当然还有自己的toString()方法,所以一切都会好的。

答案 1 :(得分:-1)

首先,toString方法来自对象类,不要尝试制作这些方法的多个或类似的东西,在一个方法中拥有所有内容。至于你的问题,你可以为你的类创建一个变量String description,并在构造函数中初始化它,然后在toString中返回该变量。如果您在创建对象后没有以任何其他方式更改对象,则可以执行此操作,但情况可能并非如此。您还可以创建两个布尔变量createdByFirstConstructorcreatedBySecondConstructor,并使用false初始化它们。然后在两个构造函数中将corrseponding变量更改为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";
}