
[code]

    A h = new A();
    h.name = "あいう";
    System.out.println(h.toString());
    
[/code]

上記の `h.toString()` の部分は `h` のみでも構わないと書籍に記載がありましたが、なぜ、`h` だけで、Aクラスでオーバーライドされた
`toString` メソッドが呼び出されるのでしょうか？  
そういう決まりなのでしょうか？

詳しい方、ご教示ください。よろしくお願いいたします。


CC BY-SA 3.0
2015-05-08T09:46:58.180
9950
2015-05-08T10:12:21.897
2015-05-08T10:03:17.967
440
8619
question
java
javaのtoStringに関しての質問


Java では Object のインスタンスが文字列化される時に `toString` が呼ばれます。

[code]

    class A {
        private String name = "I'm A";
    }
    
    class B {
        private String name = "I'm B";
        public String toString() {
            return name;
        }
    }
    
    public class Foo {
        public static void main(String[] args) {
            System.out.println(new A());           // Object.toString() が呼ばれる
            System.out.println(new B());           // B の toString() が呼ばれる
            System.out.println("Yes, " + new B()); // "Yes, " + (new B()).toString() と同じ
        }
    }
    
[/code]

1つ目と2つ目は理解頂いているとして、3つ目は実際には `"Yes, " + (new B()).toString()` と同じ処理が実行されます。


CC BY-SA 3.0
2015-05-08T10:11:01.363
9951
2015-05-08T10:11:01.363
440
9950
answer


まず、[System.out](https://docs.oracle.com/javase/jp/7/api/java/lang/System.html#out)は、`System`クラスの標準出力ストリームを保持するフィールドです。  
それは`PrintStream`のインスタンスで、[println(Object
x)](https://docs.oracle.com/javase/jp/7/api/java/io/PrintStream.html#println%28java.lang.Object%29)を呼び出します。  
[PrintStream#println](https://docs.oracle.com/javase/jp/7/api/java/io/PrintStream.html#println%28java.lang.Object%29)
の説明にあるように、

> Object を出力して、行を終了します。このメソッドは、最初に String.valueOf(x)
> を呼び出して、出力されたオブジェクトの文字列値を取得します。次に、print(String) を呼び出してから println()
> を呼び出すのと同じように動作します。

それで、これ(`println`)は、[String.valueOf(x)](https://docs.oracle.com/javase/jp/7/api/java/lang/String.html#valueOf%28java.lang.Object%29)を呼び出します。

> 引数が null の場合は "null" に等しい文字列。それ以外の場合は obj.toString() の値が返される。

それで、`String.valueOf`で、`obj.toString()`が呼び出されるので期待の動作（オーバーライドされたtoStringメソッドが呼び出される）をする。というわけです。


CC BY-SA 3.0
2015-05-08T10:12:21.897
9952
2015-05-08T10:12:21.897
5044
9950
answer