2013-02-18 18 views
0

我已经减少了一组类文件作为OO的例子。他们完美地工作,但我不明白,从WorkerTest.javaprintln呼叫如何使它一路过关斩将Worker.javaDate.java?这两个Worker.javaDate.javatoString方法,但都没有明确调用,但我可以从输出告诉我们都使用。这些方法如何被使用而不被调用?

这是如何工作,或我应该研究什么概念?

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

+2

我确定其他人可以更好地描述它,但是,如果您正在编写的值不是'String',Java将自动在'Object'上调用'toString'。 – MadProgrammer 2013-02-18 04:21:34

+1

相关问题:http://stackoverflow.com/questions/8555771/why-is-the-tostring-method-being-called-when-i-print-an-object – ajp15243 2013-02-18 04:21:57

回答

4

当println遇到一个变量时,它会尝试确定它应该如何打印。它检查是否覆盖了相关类的t​​oString()方法。因此,发生了什么事情:println需要打印类worker的实例,因此它会检查Worker类中的toString()方法。在工人类里面,它发现这条线:

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

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

+0

因为Object有'toString'方法“检查是否有toString()方法”是一个“小”的错误...虽然答案的要点是正确的)+1 – MadProgrammer 2013-02-18 04:35:16

+0

@MadProgrammer这是一个很好的观点!我试图保持它尽可能简单,但我编辑它是更准确:) – 2013-02-18 04:38:11

+1

也许,“检查,看看是否有任何'toString()** **重写**”听起来会更好。 – SudoRahul 2013-02-18 04:41:32

9

PrintStream.println(obj)电话obj.toString()。 (或者更确切地说:它调用String.valueOf(obj),进而调用obj.toString()除非obj为空引用。)

the Javadoc for java.io.PrintStream

(也许你错过的是,toString实际上是java.lang.ObjectWorkerDate的方法仅仅是覆盖它。所以所有对象有方法和JDK方法可以依靠它的存在。见the Javadoc for `java.lang.Object为所有对象都具有的所有方法的列表。)