![](/img/trans.png)
[英]Why when I print toString return false and Sysout return true?
[英]Why is the toString() method being called when I print an 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();
}
}
在参考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();
}
因为PrintStream.println
有一个带有Object
的重载,然后调用它的toString
方法。
当您直接尝试打印对象时,默认情况下它将调用toString
方法,您需要覆盖该toString
方法以打印类的属性。
因为这就是这个函数的运作方式:它为你格式化了原始类型,但是当你传递一个对象时,它会在它上面调用.toString()
。
如果你不覆盖它,它将输出默认的.toString()
实现( Class@somenumber
),这实际上并没有用......
因为java中的所有类都是java.lang.Object的子类,所以每当你尝试调用System.out.println()方法来打印对象时,它都会调用Object类的toString()方法。
对于安全原因,该方法打印哈希码,而不是该对象的值,但您已在类中继承该方法并将其定义扩展为打印对象值
public String toString() {
return "A Quarter is "+getValue();
}
所以你得到一个返回值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.