为什么在打印对象时调用toString()方法?

我似乎无法理解为什么当我在quarter对象上使用println方法时,它返回toString方法的值。 我从来没有调用过toString方法为什么我得到返回值?

public class Main { public static void main(String[] args) { Quarter q = new Quarter(); Nickel n = new Nickel(); System.out.println(q); System.out.println(n); } } public abstract class Money { private int value; public Money(int v) { value=v; } public abstract int getValue(); protected int myValue() { return value; } public abstract String toString(); } public abstract class Coin extends Money { public Coin(int value) { super(value); System.out.println("I am a coin, my value is " + getValue()); } } public class Quarter extends Coin { public Quarter () { super(25); } public int getValue() { return myValue(); } public String toString() { return "A Quarter is "+getValue(); } } public class Nickel extends Coin { public Nickel () { super(5); } public int getValue() { return myValue(); } public String toString() { return "A "+this.getClass().getName()+ " is "+getValue(); } } 

在参考java文档我不知道的是,

当你调用PrintStream类print(obj)/ println(obj)方法然后在内部调用write方法时,arguement为String.valueOf(obj),如下所示:

 public void print(Object obj) { write(String.valueOf(obj)); } 

现在String.valueOf(obj)执行调用String方法的任务,如下所示:

  /** * Returns the string representation of the Object argument. * * @param obj an Object. * @return if the argument is null, then a string equal to * "null"; otherwise, the value of * obj.toString() is returned. * @see java.lang.Object#toString() */ public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); } 

因为PrintStream.println有一个带有Object的重载,然后调用它的toString方法。

因为这就是这个函数的运作方式:它为你格式化了原始类型,但是当你传递一个对象时,它会在它上面调用.toString()

如果你不覆盖它,它将输出默认的.toString()实现( Class@somenumber ),这实际上并没有用……

当您直接尝试打印对象时,默认情况下它将调用toString方法,您需要覆盖该toString方法以打印类的属性。

因为java中的所有类都是java.lang.Object的子类,所以每当你尝试调用System.out.println()方法来打印对象时,它都会调用Object类的toString()方法。

对于安全原因,该方法打印哈希码,而不是该对象的值,但您已在类中inheritance该方法并将其定义扩展为打印对象值

 public String toString() { return "A Quarter is "+getValue(); } 

所以你得到一个返回值。