作为OO的一个例子,我把这个类文件减少了。它们完美地工作但我不明白来自 WorkerTest.java 的println
调用是如何通过 Worker.java 和 Date完成的。的java ? Worker.java 和 Date.java 都有toString
方法,但都没有显式调用,但我可以从输出中看出两者都被使用了。
这是如何工作的或我应该学习什么概念?
public class WorkerTest {
public static void main( String[] args ) {
Date birth = new Date( 7, 15, 1922 );
Worker worker = new Worker( birth );
System.out.println( worker );
}
}
public class Worker {
private Date birthday;
public Worker( Date inboundBirthday ) {
birthday = inboundBirthday;
}
public String toString() {
return String.format( "Birthday: %s", birthday );
}
}
public class Date {
private int month;
private int day;
private int year;
public Date( int inboundMonth, int inboundDay, int inboundYear ) {
month = inboundMonth;
day = inboundDay;
year = inboundYear;
}
public String toString() {
return String.format( "%d/%d/%d", month, day, year );
}
}
输出:
Birthday: 7/15/1922
答案 0 :(得分:9)
PrintStream.println(obj)
来电obj.toString()
。 (或者更确切地说:它会调用String.valueOf(obj)
,而obj.toString()
会调用obj
,除非toString
是空引用。)
请参阅the Javadoc for java.io.PrintStream
。
(也许您遗失的是java.lang.Object
实际上是Worker
上的一种方法?Date
而{{1}}只是覆盖它。所以 all < / em>对象具有该方法,并且JDK方法可以依赖于它的存在。请参阅the Javadoc for `java.lang.Object以获取所有对象具有的所有方法的列表。)
答案 1 :(得分:4)
当println遇到变量时,它会尝试确定如何打印它。它检查是否已覆盖相关类的toString()方法。所以这就是正在发生的事情:println需要打印类worker的实例,因此它会检查Worker类中的toString()方法。在worker类中,它找到了这一行:
return String.format( "Birthday: %s", birthday );
现在必须弄明白如何打印生日。由于birthday是Date的一个实例,它会检查Date的toString()方法。理解这一切的关键是Java的内置类也有toString()方法,你只是看不到它们。这是一个很好的例子,因为它可以向您展示幕后发生的事情。
答案 2 :(得分:3)
PrintStream.println()
明确拨打String.valueOf()
,后者又调用Object.toString()
,在您的两个对象中被覆盖。