0

我将这组精简的类文件作为 OO 的示例。它们工作得很好,但我不明白来自WorkerTest.javaprintln的调用是如何通过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

4

3 回答 3

9

PrintStream.println(obj)来电obj.toString()。(或者更准确地说:它调用String.valueOf(obj),而后者又调用obj.toString()除非obj是空引用。)

请参阅Javadoc 了解java.io.PrintStream.

(也许你缺少的是它toString实际上是java.lang.Object?上的一个方法Worker并且Date只是覆盖它。所以所有对象都有那个方法,JDK 方法可以依赖它的存在。有关列表,请参阅Javadoc 中的 `java.lang.Object所有对象拥有的所有方法。)

于 2013-02-18T04:21:26.040 回答
4

当 println 遇到一个变量时,它会尝试确定应该如何打印它。它检查相关类的 toString() 方法是否已被覆盖。所以这就是发生的事情:println 需要打印一个 class worker 的实例,所以它会检查 Worker 类中的 toString() 方法。在工人类中,它找到了这一行:

return String.format( "Birthday: %s",  birthday );

现在它必须弄清楚如何打印生日。由于生日是 Date 的一个实例,它检查 Date 的 toString() 方法。理解这一切的关键是 Java 的内置类也有 toString() 方法,只是你看不到它们。这是一个很好的例子,因为它向您展示了幕后发生的事情。

于 2013-02-18T04:23:23.460 回答
3

PrintStream.println()显式调用String.valueOf(),然后调用Object.toString(),这在您的两个对象中被覆盖。

于 2013-02-18T04:23:14.243 回答