続・とってもわかりやすいJAVA 【第25回 Objectクラス②】


今回も引き続きObjectクラスについて説明していきます。
前回Objectクラスのメソッド、特にequalsメソッドについてでしたが今回はtoStringメソッドについて紹介しようと思います。

toString()

ObjectクラスにはtoString()が定義されています。
つまり、どんなオブジェクトでもこのtoStringメソッドを呼び出すことができます。
このメソッドを呼び出すと、オブジェクトの文字列表現を返してくれるようになっています。
要はどんなオブジェクトでも文字列という人間がみてわかる形にできるわけです。
ではサンプルをみてみましょう。

SampleToString_01.java

public class SampleToString_01 {
    public static void main(String[] args) {
        Human_0126_01 tanaka = new Human_0126_01();
        tanaka.setName("田中");
        System.out.println(tanaka.toString());
        Human_0126_01 satoh = new Human_0126_01();
        satoh.setName("佐藤");
        System.out.println(satoh);
    }
}

class Human_0126_01 {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

実行結果

Human_0126_01@774085
Human_0126_01@ec6354

解説

このプログラムはtanakaとsatohというオブジェクトを出力しようとしています。
出力の形式は、「クラス名@ハッシュコード」となっています。
これはObjectクラスで定義されています。
ハッシュコードとはオブジェクトに割り当てられる16進数の数となります。
すると、オブジェクトを文字列として表現できるわけですね。

5行目ではtoString()を呼び出していますが、8行目では呼び出していません。
実はSystem.out.print()の引数にオブジェクトを渡すと自動的にtoString()が呼ばれる仕組みになっているのです。
つまり、toString()をオーバーライドすれば、System.out.print()で出力する際の表示形式を自分で決められるわけなのです!

では上のサンプルでnameを表示するよう変えてみましょう。

SampleToString_02

public class SampleToString_02 {
    public static void main(String[] args) {
        Human_0126_02 tanaka = new Human_0126_02();
        tanaka.setName("田中");
        System.out.println(tanaka.getName());
        Human_0126_02 satoh = new Human_0126_02();
        satoh.setName("佐藤");
        System.out.println(satoh);
    }
}

class Human_0126_02 {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String toString() {
        return name;
    }
}

 

実行結果

田中
佐藤

解説

名前を表示する方法は2つ。
まず5行目ではgetName()を呼び出してnameを取ってきています。
一方で8行目ではtoString()を呼び出しています。
Human_0126_02クラスのtoString()はオーバーライドされていて、nameをreturnするようになっています。
すると、「田中」、「佐藤」という各オブジェクトのnameを表示することができます。
「参照変数名.getName()」で名前を表示するか、それとも「参照変数名」で名前を表示するか。
今回は後者の方が楽にみえますが、場面によって使いわけていきます。
ちなみにStringクラスやIntegerクラスではtoString()がオーバーライドされています。

まとめ

  • ObjectクラスではtoString()が実装されていて、「クラス名@ハッシュコード」を返してくれる。
  • toString()はオーバーライドでき、そのオブジェクトをどのような文字列で表現するかを自分で決めることができる。
  • このエントリーをはてなブックマークに追加

PAGE TOP