Java 重载toString方法

Java 重载toString方法,java,constructor,overloading,tostring,Java,Constructor,Overloading,Tostring,我正在尝试为具有多个构造函数的类编写toString方法: public Fraction(int n1, int d1, int n2, int d2) { num1=n1; den1=d1; num2=n2; den2=d2; } 及 但是,当我尝试编写toString时,我总是会遇到编译错误(可能是因为这两个方法都称为toString): 如果我将一个toString方法命名为toString,另一个命名为toString2,则程序会编译,但不会为toSt

我正在尝试为具有多个构造函数的类编写toString方法:

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

但是,当我尝试编写toString时,我总是会遇到编译错误(可能是因为这两个方法都称为toString):

如果我将一个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库中有太多的类使用它(例如,矩形类)


有什么建议吗?提前谢谢

首先,
toString
方法来自对象类,不要试图使这些方法或类似的东西成为多个,将所有内容都放在一个方法中。至于你的问题,你可以为你的类创建一个变量
String description
,然后在构造函数中初始化它,然后在
toString
中返回该变量。如果在创建对象后不以任何其他方式更改对象,则可以这样做,但情况可能并非如此。您还可以创建两个布尔变量
createdByFirstConstructor
createdBySecondConstructor
,并用false初始化它们。然后在两个构造函数中,将相应的变量更改为
true
,然后在
toString
中,只需检查哪个变量设置为true并相应地打印即可。希望这有帮助。也许有更简单的解决办法,但我现在想不起来,也许以后再想

private boolean createdByFirst=false;
私有布尔createdBySecond=false;
公共分数(代码){
createdByFirst=true;
}
公共分数(yourOtherCode){
createdBySecond=true;
}
公共字符串toString(){
如果(createdByFirst)
返回“yourStringForFirstConstructor”;
else if(createdBySecond)
返回“yourStringForSecondConstructor”;
其他的
返回“其他东西”;
}

当你的老师让你试着看看如何对两种不同的分数进行建模时,他们并不是想用两个构造函数和两组完全不相关的成员变量将两种实现塞进同一个类中。这和飞行烤面包机一样有道理


您的老师希望您演示如何创建一个基本的
分数
类,该类定义分数的接口而无需任何实现,然后编写两个子类,(查找
扩展
关键字),一个以一种方式进行分数,另一个以不同方式进行分数。每个子类都有自己的构造函数、自己的成员变量集,当然还有自己的
toString()
方法,所以一切都会很好。

您的代码中至少有10个编译器错误。正如我在文章中提到的,我知道我的代码有编译器错误,即在if语句中。然而,由于我还是一个初学者,我不知道如何修复这些错误。我需要帮助的主要部分是如何对if语句进行编码,以便它能说出我在上面的引号中提到的内容。至少给出编译器错误,并试着理解。如果我之前听起来很鲁莽,请原谅。这根本不是我的本意。无论如何,我会继续玩我的代码,并试图找到一个解决方案。谢谢你的帮助我完全理解你的意思。最初的任务是创建一个基分数类。然而,由于我在一个初级编程课上,我的老师将作业修改为我上面的版本(分子和分母在同一个构造函数中)。无论如何谢谢你!同一个构造函数中的分子和分母是一回事。由一个构造函数初始化的一组成员变量和由另一个构造函数初始化的一组无关成员变量完全是另一回事。我明白你现在说的了。我第一次误解了你的评论。如果这听起来像是一个愚蠢的问题,很抱歉,但是如果我的第二组变量(nAnswer和dAnswer)是从方法类中的第一组变量(num1,den1,num2,den2)派生的(例如:nAnswer=num1*den2+num2*den1),这仍然是一个问题吗?谢谢你的帮助。作为一个初学者,我真的很感激。哦,所以
nAnswer
dAnswer
应该是某种结果。那么我想你不需要两个子类,只有一个子类就足够了
nAnswer
dAnswer
将在基本(超级)类中,其余将在子类中。在子类中,如果在基类中将
nAnswer
声明为
protected
,则可以执行
nAnswer=num1*den2+num2*den1
。(“Protected”表示派生类可以访问它。)因此,基类的
toString()
将返回
nAnswer
dAnswer
的字符串表示,而子类的
toString()
将返回所有内容的字符串表示。提示:您可以执行
super.toString()
从子类的
toString()
中调用基类的
toString()
。谢谢!我将尝试此更新:我刚刚尝试了这段代码,尽管我仍然会遇到编译错误,但至少它是我可以使用的起点。再次感谢!
public String toString()
{
    return "Fraction[numerator1="+num1+", numerator2="+num2+", denominator1="+den1+", denominator2="+den2+"]";
}

public String toString()
{
    return "Fraction[nAnswer="+nAnswer+", dAnswer="+dAnswer+"]";
}
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+"]";
    }
}