Tips

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

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

今回はObjectクラスについて説明します!

Objectクラスとは

JavaにはObjectクラスというクラスが用意されています。 このObjectクラスは全てのクラスのスーパークラスとなります。 今まで使ってきたStringクラスやScannerクラス、あるいは独自に定義したSample○○クラスも全てObjectクラスのサブクラスです。 このように、ObjectクラスはJavaのクラスの階層構造において最上位に位置するクラスなのです。 しかしObjectクラスを継承しているというのに、「extends Object」という記述はありません。 実はコンパイルの際に、自動で「extends Object」が付与されます。 したがってわざわざ記述しなくても、Objectクラスが継承できるのです。

Objectクラスのメソッド

Objectクラスを継承するということは、Objectクラスで定義されたメソッドが全てのクラスで使えるようになる、ということです。 Objectクラスで定義されているメソッドは以下の通りです。

  1. clone()
  2. equals(Object obj)
  3. finalize()
  4. getClass()
  5. hashCode()
  6. notify()
  7. notifyAll()
  8. toString()
  9. wait()
  10. wait(long timeout)
  11. wait(long timeout, int nanos)

この中で前回も出てきたequalsメソッドに焦点を当ててみます。

equalsメソッド

上記の中で一番使う機会が多いのがおそらくequalsメソッドだと思います。 前回も出てきましたが、実はObjectクラスで定義されたものだったんですね。 したがってそのサブクラスとなるStringクラスでもequalsメソッドが使える訳です。 しかし、Stringクラスでは継承されたequalsメソッドの処理が書き換えられています。 つまり、オーバーライドされています。 Objectクラスのequalsメソッドはもともと参照先の比較を行っていて、==演算子と同じです。 しかし、オーバーライドすることによってオブジェクトが持つ値の比較ができるようになります。 Stringクラス以外だと、Integerクラスもequalsメソッドがオーバーライドされています。 ■SampleEquals_02.java

public class SampleEquals_02 {
    public static void main(String[] args) {
        Integer wi1 = new Integer(10);
        Integer wi2 = new Integer(10);

        System.out.println("==演算子 : " + (wi1 == wi2));
        System.out.println("equalsメソッド : " + wi1.equals(wi2));
    }
}

実行結果

==演算子 : false
equalsメソッド : true

解説

前回と同じですね。 IntegerクラスもStringクラスと同じで、参照先ではなく値の比較となります。 それではequalsメソッドがオーバーライドされていない場合をみてみましょう。

SampleEquals_03.java

public class SampleEquals_03 {
    public static void main(String[] args) {
        SampleEquals_01 se1 = new SampleEquals_01();
        SampleEquals_01 se2 = new SampleEquals_01();

        System.out.println("==演算子 : " + (se1 == se2));
        System.out.println("equalsメソッド : " + se1.equals(se2));
    }
}

実行結果

==演算子 : false
equalsメソッド : false

解説

SampleEquals_03クラスを独自に定義してました。 しかしequalsメソッドがオーバーライドされていません。 そのため「==演算子」でも「equalsメソッド」でも参照先の比較となります。 se1の値とse2の値はそれぞれ別のメモリ領域に格納されるため、参照先は別となり、どちらもfalseが返ってきます。

まとめ

今回も「==演算子」と「equalsメソッド」使い分けがポイントです。 しかし、どのクラスがオーバーライドされていてどのクラスがされていない、といちいち覚えるのは時間の無駄です。 もう一律で、

  • ==演算子は参照先の比較
  • equalsメソッドは値の比較

と覚えてしまいましょう!

新連載はじまりました!新Java基礎 連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search