Java
初心者

【Java】暗黙の継承メモ


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