Java入門 基本情報技術者へのステップアップ – Object クラス、文字の比較 – #プログラム初心者からの脱出③

Objectはすべてのクラスの親クラス

「java.lang.Object」は、すべてのクラスの親になる重要なクラスです。Javaのクラスではextendsを書かない場合に、自動的にjava.lang.Objectを継承したサブクラスになります。

java.lang.Objectには、いくつかの重要なメソッドがあります。

Java.lang.Objectクラスのメソッド

すべてのクラスがObjectクラスを継承しているということは、Objectクラスで定義されたメソッドはすべて使える、ということです。

メソッドは9個あり、オーバーライドできるものとできないものにわけられます。

clone()インスタンスを複製する。制約が多いので現在ではほとんど使われない。
equals(Object obj)インスタンスを比較する。インスタンスの比較を行う場合にはオーバーライドすること。
finalize()インスタンスの終了処理を行う。オーバーライド時に良くない副作用が確認されているため現在ではほとんど使われない。
hashCode()インスタンスのハッシュ値を返す。HashMap 等で使用する場合にはオーバーライドすること。
toString()インスタンスの文字列表現を返す。System.out.println() メソッド等の出力結果となるため必要に応じてオーバーライドする。
getClass()クラス (継承している場合はサブクラス) のクラス・リテラルを返す。(オーバーライドできない)
notify()マルチスレッド環境で Java VM が使用する。(オーバーライドできない)
notifyAll()マルチスレッド環境で Java VM が使用する。(オーバーライドできない)
wait()マルチスレッド環境で Java VM が使用する。3 つのオーバーロードメソッドがある。(オーバーライドできない)

equalメソッド

オブジェクトの値を比較をする(一致しているかどうか)ために使用します。同じオブジェクトを参照しているかどうか比較するためには「==」を使用します。

別のページでも書きましたが、java.lang.Stringクラスでおさらいをしておきましょう。

class ObjectTest{
  public static void main(String args[]){
    String str1 = "apple";
    String str2 = new String("apple");

    if (str1 == str2) {
      System.out.println("1は同じです。")
    } else {
      System.out.println("1は違います。")
    }

    if (str1.equals(str2)) {
      System.out.println("2は同じです。")
    } else {
      System.out.println("2は違います。")
    }
  }
}

// -----
// 出力結果(System.out.println)
// 1は違います。
// 2は同じです

「==」演算子は参照先の比較、equalsメソッドは値の比較と覚えておきましょう。

toStringメソッド

toStringメソッドは、文字列表現を返すメソッドです。

あまり意識をせずに使っているtoStringメソッドですが、とても重要な役割をしています。

import java.util.HashMap;
import java.util.Map;

class ObjectTest2{
  public static void main(String args[]){
    Map<String, String> map = new HashMap<>();
    map.put("apple", "りんご");
    map.put("orange", "みかん");
    map.put("banana", "ばなな");
    System.out.println(map);
  }
}

// -----
// 出力結果(System.out.println)
// {apple=りんご, orange=みかん, banana=ばなな}

java.lang.String以外の参照型が引数に指定された場合は、そのオブジェクトのtoString()メソッドで文字列が取得され出力されます。

つまり、次のメソッドが実行されたのと同じになります。

System.out.println(map.toString());

また、出力結果が上記のようになるのは、java.util.HashMapクラスでtoStringメソッドをオーバーライドして、上記の出力になるように文字列を返しているからです。

public class Dog {
  private String name;
  public Dog (String name) {
    this.name = name;
  }
  public static void main(String[] args) {
    Dog dog = new Dog("ポチ");
    System.out.println(dog);
  }
}
// 出力結果(System.out.println)
// Dog@2073b879

このように、toStringメソッドをオーバーライドしないで使った場合、 よくわからない文字列が表示されます。 (実は、「オブジェクト名+@+ハッシュコード」です。)

DogクラスのtoStringメソッドをオーバーライドすれば、ちがった結果が表示されます。

public class Dog {
  private String name;
  public Dog (String name) {
    this.name = name;
  }
  @override
  public String toString() {
    retuen "名前は" + name;
  }
  public static void main(String[] args) {
    Dog dog = new Dog("ポチ");
    System.out.println(dog);
  }
}
// 出力結果(System.out.println)
// 名前はポチ

実際の現場では、省略されることの多いtoStringメソッドですが、オーバーライドしておくと便利なことが多くあります。