【初心者必見】Java8におけるStringクラスのメソッドのオーバーライド

オーバーライドとは、簡単に言うとサブクラスでスーパークラスのメソッドを作り直すことです。オーバーライドはポリモーフィズムを可能にしますポリモーフィズムとは、同じ名前のメソッドに対して違った処理をさせることです

順を追って説明します。

まず、サブクラスをスーパークラスの参照で扱うメリットをStringクラスのequals()メソッドを使って説明しましょう。

その前にinstanceof演算子について簡単にご紹介しておきます。この演算子はインスタンスのクラスを調べるときに有効な演算子です。

使用例です。

String s = "Hello";
System.out.println(s instanceof String);

tureと表示されます。

その上で、Stringクラスのequals()メソッドを読み解いていきましょう。

ソースコードを読む前に要件を整理しておきます。

前提:"Hello".equals("Hello")がtrueになることを検証する

文字列"Hello"と比較対象の文字列 "Hello"が同じであるということは以下の2つのパターンがあります。(下図)

1.どちらの参照の中身も同じ場合(同一のインスタンスを指している場合)
2.同一のインスタンスではないが、すべての文字が同じである場合

文字列 が同じであるということの2つのパターンを新人エンジニア研修向けに解説
文字列が同じであるということの2つのパターン

そして2.のケースでは、以下の3つの基準をクリアすれば同じ文字列であるということが言えます。

①比較対象も文字列である

②比較対象文字と文字数が同じである(Helloの場合は5)

③先頭文字から一文字づつ比較していって最後まで同じ文字である

※①②がfalseであれば早急に同じ文字列でないと判断できるので時間短縮ができる

それをJavaのコードで表現しているのがStringクラスのequals()メソッドです。(注:以下はJava8の例です。以降のバージョンでは高速化のためコードが変わっています)

なお、このコードで使われている変数valueは、インスタンスの文字列(今回の例では"Hello")が一文字ずつ格納されているchar型の配列です。

合計4つのif文があり少々複雑ですが、上記の説明と対応させてコメントを入れました。

public boolean equals(Object anObject) {
  if (this == anObject) { //1
    return true;
  }
  if (anObject instanceof String) { // 2-①
    String anotherString = (String)anObject;
    int n = value.length;
    if (n == anotherString.value.length) {// 2-②
      char v1[] = value;
      char v2[] = anotherString.value;
      int i = 0;
      while (n-- != 0) {
        if (v1[i] != v2[i]) // 2-③
          return false;
        i++;
        }
        return true;
      }
    }
    return false;
  }

Java8 標準API

(n- -!= 0)という表現が見慣れないかと思います。これは、以下と同じなのですが、上記の書き方で1行短くしているのです。

while (n != 0) {
  n--;
  if (v1[i] != v2[i]) // 2-③
    return false;
  i++;
}

Stringクラスのequals()メソッドは2つの変数が同じインスタンスを参照していなくても、同じ値(文字列)を持っていれば同じ、という意味だということを私達は学びました。

それは、このようなコードで実現されているわけです。


中古車でしたら全く同じ車体でないと同じ車と判断してはいけませんね。しかし、新車でしたら同じ車と判断しても良い車がたくさんありますね。

では、Javaプログラムでは何をもって同じインスタンスと判断しましょうか?

それは、プログラムの目的によって変わりますね。

したがって、クラスごとにそのクラスに合ったequals()メソッドに書き換える(オーバーライドする)ことができるのです。Stringクラスのequal()メソッドの例で見たように、サブクラスでスーパークラスのメソッドを変更することができます。これをオーバーライド(override)と言います。英語ではover「上に」ride「載せる」ということで優先させる・上書きするという意味です。オーバーロード(多重定義:同じメソッド名であっても、引数の数や型が異なる複数のメソッドを定義すること)と名前が似ているので注意してください

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。