public class potpie {
private int month;
private int day ;
private int year;
public potpie(int m,int d,int y) {
month=m;
day=d;
year=y;
System.out.printf("The constructor for this is"+this);
}
public String toString() {
return String.format("%d/ %d/ %d/", month,year,day);
}
}
class apples {
public static void main(String args[])
{
potpie x= new potpie(4,5,6);
}
}
答案 0 :(得分:0)
魔术位于+
的{{1}}运算符中。使用String
向String
添加Object
时,JVM会调用+
上的toString
方法,以确定Object
的内容连接。
此外,String
表示正在运行当前方法的实例,因此通过this
运算符向this
添加String
,您获得+
1}}调用当前实例。
<强> 15.18.1。 String Concatenation Operator +
如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。
<强> 5.1.11。字符串转换
任何类型都可以通过字符串转换转换为String类型。
基本类型T的值x首先转换为引用值,就好像将它作为参数提供给适当的类实例创建表达式(第15.9节):
如果T是布尔值,则使用new Boolean(x)。
如果T为char,则使用新字符(x)。
如果T是byte,short或int,则使用new Integer(x)。
如果T很长,则使用新的Long(x)。
如果T为float,则使用new Float(x)。
如果T为double,则使用new Double(x)。
然后通过字符串转换将此引用值转换为String类型。
现在只需要考虑参考值:
如果引用为null,则将其转换为字符串“null”(四个ASCII字符n,u,l,l)。
否则,转换的执行就好像通过调用没有参数的引用对象的toString方法一样;但是如果调用toString方法的结果为null,则使用字符串“null”。
在您的情况下,这是适用的第5.1.11节中的最后一个要点。
答案 1 :(得分:0)
这与this
没有任何关系。它更多地是关于+
如何使用字符串。
+
运算符,当其中一个操作数是字符串而另一个不是,它将尝试将另一个操作数转换为字符串。例如:
"My age is: " + 30
它会尝试将30转换为字符串。这可以通过
来完成"My age is: " + (new Integer(30)).toString()
情况与您的情况完全相同。你的表达:
"The constructor for this is"+this
+
的第二个操作数不是字符串,因此编译器会尝试将this
转换为字符串。所以toString
被称为:
"The constructor for this is"+this.toString()
toString
通常是将任何引用类型转换为字符串的方式。
答案 2 :(得分:0)
如果要将任何对象表示为字符串,则toString()方法就会出现。
toString()方法返回对象的字符串表示形式。
如果打印任何对象,java编译器会在内部调用对象上的toString()方法。所以重写toString()方法,返回所需的输出,它可以是对象的状态等取决于你的实现。