0

OOの例として、この簡素化されたクラスファイルのセットがあります。それらは完全に機能しますが、WorkerTest.javaからのprintln呼び出しがWorker.javaからDate.java至るまでどのように行われるのかわかりません。Worker.javaDate.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)、それはを呼び出します。これは、null参照で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はクラス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()ます。これは、2つのオブジェクトでオーバーライドされます。

于 2013-02-18T04:23:14.243 に答える