为什么在调用System.out.println for object时调用`toString`方法

时间:2018-04-02 19:25:35

标签: java tostring

我从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)

3 个答案:

答案 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()。这就是它打印相对有意义的输出的方式。