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