重载 toString 方法

Posted

技术标签:

【中文标题】重载 toString 方法【英文标题】:Overload a toString Method 【发布时间】:2017-01-25 19:28:24 【问题描述】:

我正在尝试为具有多个构造函数的类编写一个 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;如果您的fraction 看起来像第二个构造函数,返回第二个 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 类)。

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

【问题讨论】:

您的代码中至少有 10 个编译器错误。 正如我在帖子中提到的,我知道我的代码存在编译器错误,即在 if 语句中。但是,由于我仍然是初学者程序员,我不确定如何修复这些错误。我需要帮助的主要部分是如何编写 if 语句,以便它说出我在上面引用中提到的内容。 至少给出编译器错误 - 并尝试理解。 对不起,如果我之前听起来很鲁莽。这根本不是我的本意。无论如何,我会继续使用我的代码并尝试找到解决方案。感谢您的帮助 【参考方案1】:

当您的老师告诉您尝试了解如何对两种不同类型的分数进行建模时,他们并不是要尝试将两种实现都塞进具有两个构造函数和两组完全不相关的成员变量的同一个类中。这与飞行烤面包机一样有意义。

你的老师要你证明你理解如何创建一个基本的Fraction类,它定义了一个没有任何实现的分数的接口,然后编写两个子类,(查找extends关键字,)一个以一种方式做分数,另一种以不同的方式做分数。每个子类都有自己的构造函数、自己的一组成员变量,当然还有自己的toString() 方法,所以一切都会好起来的。

【讨论】:

我完全明白你在说什么。最初的任务是创建一个基本的 Fraction 类。但是,由于我在初学者的编程课上,我的老师将作业修改为我上面的版本(分子和分母都在同一个构造函数中)。还是谢谢! 同一个构造函数中的分子和分母是一回事。一个构造函数初始化的一组成员变量,和另一个构造函数初始化的一组不相关的成员变量,完全是另一回事。 我明白你现在在说什么了。我第一次误解了你的评论。抱歉,如果这听起来像一个愚蠢的问题,但如果我的第二组变量(nAnswer 和 dAnswer)是从方法类中的第一组变量(num1、den1、num2、den2)派生的(例如:nAnswer=num1* den2+num2*den1),这还有问题吗?谢谢你的帮助。作为一个初学者,我真的很感激。 哦,所以nAnswerdAnswer 应该是某种结果。那么我想你不需要两个子类,一个就足够了。 nAnswerdAnswer 将在基(超)类中,其余的将在子类中。如果在基类中将nAnswer 声明为protected,则在子类中您可以执行nAnswer=num1*den2+num2*den1。 (“受保护”表示派生类可以访问它。) 因此,基类的toString() 将返回nAnswerdAnswer 的字符串表示,而子类的toString() 将返回所有内容的字符串表示。提示:您可以通过 super.toString() 从子类的 toString() 中调用基类的 toString()【参考方案2】:

首先,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";

【讨论】:

谢谢!我试试这个 更新:我刚刚尝试了这段代码,虽然我仍然遇到编译错误,但至少它是我可以尝试的起点。再次感谢!

以上是关于重载 toString 方法的主要内容,如果未能解决你的问题,请参考以下文章

重载tostring()方法重要性

Java中啥时候需要显示重载toString方法

Arrays 类中的 .toString() 是如何重载的

重载 toString 方法

重载tostring函数是啥意思?

方法“ToString”没有重载需要 1 个参数