我从geeksforgeeks遇到了这段代码。而且我没有弄清楚为什么toString
方法因System.out.println(c2)
而被调用。我预计输出为c2
对象的地址。
final class Complex {
private double re, im;
public Complex(double re, double im) {
this.re = re;
this.im = im;
}
Complex(Complex c)
{
System.out.println("Copy constructor called");
re = c.re;
im = c.im;
}
public String toString() {
return "(" + re + " + " + im + "i)";
}
}
class Main {
public static void main(String[] args) {
Complex c1 = new Complex(10, 15);
Complex c2 = new Complex(c1);
Complex c3 = c1;
System.out.println(c2);
}
}
输出是:
Copy constructor called
(10.0 + 15.0i)
答案 0 :(得分:1)
println(Object o)
重载以调用print(String.valueOf(o))
然后println()`请参阅docs。
如果对象未覆盖toString()
Object.toString()
被调用。
如果没有覆盖该方法,则从后续调用hashCode()中获取地址。
答案 1 :(得分:1)
因为当您为对象类型调用Systme.out.println
时,它会尝试通过调用以下static
方法String.valueOf(x)
将您传递的对象转换为字符串,如果您查看{{ 1}}您将找到以下代码:
String.valueOf(x)
如果对象不是/**
* Returns the string representation of the {@code Object} argument.
*
* @param obj an {@code Object}.
* @return if the argument is {@code null}, then a string equal to
* {@code "null"}; otherwise, the value of
* {@code obj.toString()} is returned.
* @see java.lang.Object#toString()
*/
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
,则调用其null
方法
请阅读此how-does-system-out-print-work链接以获取更多信息
答案 2 :(得分:-1)
System.out.println()在传递Object时会调用toString()。这就是它打印相对有意义的输出的方式。