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

时间:2011-12-18 23:44:21

标签: java object

我似乎无法理解为什么当我在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();
    }
}

5 个答案:

答案 0 :(得分:18)

On请参阅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 <code>Object</code> argument.
 *
 * @param   obj   an <code>Object</code>.
 * @return  if the argument is <code>null</code>, then a string equal to
 *          <code>"null"</code>; otherwise, the value of
 *          <code>obj.toString()</code> is returned.
 * @see     java.lang.Object#toString()
 */
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}

答案 1 :(得分:3)

因为PrintStream.println的重载需要Object,然后调用其toString方法。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

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

所以你得到一个返回值。