如何在不调用的情况下使用这些方法?

时间:2013-02-18 04:17:46

标签: java

作为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

3 个答案:

答案 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遇到变量时,它会尝试确定如何打印它。它检查是否已覆盖相关类的t​​oString()方法。所以这就是正在发生的事情: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(),在您的两个对象中被覆盖。