furutatsuのメモ帳

ぼくがソフトウェアを設定したことや組んだプログラムを見返すためのブログです。

オブジェクト変数だけをsysoutすると

大学のTAやってて気づいたこと。
JavaでSystem.out.println(オブジェクト変数.toString)をSystem.out.println(オブジェクト変数)で出力すると、前者のメソッド呼び出しと同じ動作になるようです。

試しにこんなコードを作って、

class Hoge {
  String name;
  int    age;

  public Hoge(String name, int age) {
    this.name = name;
    this.age  = age;
  }

  public String toString() {
    return String.format("%s name:%s age:%d", super.toString(), name, age);
  }

  public static void main(String args[]) {
    Hoge foo = new Hoge("foo", 22);

    System.out.println("With    toString -> " + foo.toString());
    System.out.println("Without toString -> " + foo); // このままこのクラスのtoStringを呼び出すらしい
  }
}

実行してみたところ、

% java Hoge
With    toString -> Hoge@593d93f4 name:foo age:22
Without toString -> Hoge@593d93f4 name:foo age:22

toStringがあってもなくても、このメソッドが呼び出されることがわかった。

ちなみに、toStringを定義しない場合、ObjectクラスのtoString(super.toString)が呼び出されるらしい。

追記
オブジェクトの内容を表示するのに便利なtoStringメソッドですが、今のプログラムだと、クラスのメンバ変数が増えたりしたら減ったりしたらtoStringメソッドにもその変数を追加削除しなければならない。そんなのはめんどくさいので、リフレクションを使ったら便利だと思う。そうすることで、いちいちtoStringに変数の追加削除をしなくても済むから。