Help us understand the problem. What is going on with this article?

【Java】暗黙の継承メモ

More than 1 year has passed since last update.

Objectクラス

あらゆるクラスの祖先としてObjectクラスがある。しれっと継承されている。
以下のメソッドを持っている。

  • equals():あるインスタンスが自分自信と同じか調べる。
  • toString():自分自身の内容の文字列表現を返す。

Objectクラスがあることで、多態性を利用して「何型でもいいからインスタンスを渡せるメソッド」が作れたり、「すべてのクラスが最低限持っていて欲しいメソッド」が定義できたりする。

System.out.printlnなんかは引数にオブジェクトを受け取れる。
なので、

Sub.java
public class Sub{
    // なんか内容書いてあるとして
}
Main.java
public class Main
    public static void main(String[] args){
        Sub s = new Sub();

        System.out.println(s);            // (1)
        System.out.println(s.toString()); // (2)
}

(1)(2)の出力結果は同じになる。

実行結果.
test.Sub@5c8da962
test.Sub@5c8da962

toStringメソッド

オーバーライドして使っていく。さっきの例で行くと、

Sub.java
public class Sub {
    String name = "本田未央";

    public String toString(){
        return this.name;
    }
}
Main.java
public class Main
    public static void main(String[] args){
        Sub s = new Sub();
        System.out.println(s);            // (1)
        System.out.println(s.toString()); // (2)
}
実行結果.
本田未央   // (1)
本田未央   // (2)

一体なんのプログラムなんだこれは。(雑すぎる)

なお、StringクラスのtoStringメソッド自体は

String.java
public class toString(){
    return this;
}

これだけらしい。EclipseでF3押して読んだが、2806行目にあった。

equalsメソッド

等価判断・等値判断に使われることがある。

  • 等値:参照しているアドレスが同じ。==演算子で判定。
  • 等価:参照しているアドレスは異なるが値は同じ。equalsメソッドで判定。

という雑な認識。
素のequalsメソッド自体は、

String.java
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;

(1002行目にあった)
今これを詳しく見ていくと夜だし徹夜しそうなのだが。
でも、とても大雑把に言うと、実際は等値判定をやっている、ということだそう。
というわけで、実際使う時は何を以って等価とするかを決めておく。

ここでは仮にnameフィールドが一緒だったらヨシ!ということで……

Sub.java
public class Sub {
    String name = "本田未央";

    public boolean equals(Object o){
        // 等値だった場合(間違いなく等価)
        if (this == o) {
            return true;
        }

        // 等価だった場合
        if (o instanceof Sub) {
            Sub s = (Sub) o;
            if (this.name == s.name) {
                return true;
            }
        }

        // 等値でも等価でもなかった場合
        return false;
    }
}
Main.java
public class Main {
    public static void main(String[] args) {
        // インスタンスを3個生成
        Sub s1 = new Sub();
        Sub s2 = new Sub();
        Sub s3 = new Sub();

        // それぞれのnameフィールドに値を入れる
        s1.name = "本田未央";
        s2.name = "本田未央";
        s3.name = "本田圭佑";

        // 等価判定の結果を出力
        System.out.pritln( s1.equals(s2) );
        System.out.pritln( s1.equals(s3) );
    }
}
出力結果.
true
false

本当に雑なプログラムだ
まぁ、使い方の覚え書きだから何でもいいんだけど……

参考書籍

スッキリわかるJava入門第二版
Pp.541-551

shg3
学習
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away