我是Java新手,我正在尝试解决我教授给出的练习。 他给了这堂课
public class MioPunto {
public int x;
public int y;
public String toString() {
return ("[" + x + "," + y + "]");
}
}
我应该用main方法编写另一个类。进入主要我必须打印坐标而不显式调用" toString"方法。 我不自觉地用这种方式解决了它
public class TestMioPunto{
public static void main(String[] args){
MioPunto inizio = new MioPunto();
MioPunto fine = new MioPunto();
inizio.x=10;
inizio.y=10;
fine.x=20;
fine.y=30;
System.out.println("Inizio: " + inizio + "\n" + "Fine: " + fine);
}
}
答案 0 :(得分:2)
当您在toString
和对象上使用+
时,Java会调用String
。
所以你的
System.out.println("Inizio: " + inizio + "\n" + "Fine: " + fine);
与
相同System.out.println("Inizio: " + inizio.toString() + "\n" + "Fine: " + fine.toString());
除了,如果inizio
或fine
为null
,则第一个不会给您错误(您会看到null
而在字符串中),但第二个将。
来自JLS关于the String Concatenation operator的部分:
如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。
引用String Conversion section,它说(在讨论将原语转换为字符串之后):
...
现在只需要考虑参考值:
如果引用为null,则将其转换为字符串“null”(四个ASCII字符n,u,l,l)。
否则,转换的执行就好像通过调用没有参数的引用对象的toString方法一样;但是如果调用toString方法的结果为null,则使用字符串“null”。
答案 1 :(得分:1)
由于java.lang.Object
是MioPunto
的隐式基类(因为它是所有Java对象的基类),因此方法MioPunto.toString()
是覆盖 Object.toString()
方法。
由于所有对象都具有toString()
的实现,因此Java编译器可以在使用toString()
运算符执行的字符串连接链中的任何对象上自由添加+
的调用:
字符串连接运算符
+
(第15.18.1节),当给定String
操作数和引用时,将通过调用{{}将引用转换为String
1}}引用对象的方法(如果toString
的引用或结果是"null"
引用,则使用toString
),然后生成新创建的null
这是两个字符串的串联。