Objectクラス#
あらゆるクラスの祖先としてObjectクラスがある。しれっと継承されている。
以下のメソッドを持っている。
-
equals():あるインスタンスが自分自信と同じか調べる。 -
toString():自分自身の内容の文字列表現を返す。
Objectクラスがあることで、多態性を利用して「何型でもいいからインスタンスを渡せるメソッド」が作れたり、「すべてのクラスが最低限持っていて欲しいメソッド」が定義できたりする。
System.out.printlnなんかは引数にオブジェクトを受け取れる。
なので、
public class Sub{
// なんか内容書いてあるとして
}
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メソッド##
オーバーライドして使っていく。さっきの例で行くと、
public class Sub {
String name = "本田未央";
public String toString(){
return this.name;
}
}
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メソッド自体は
public class toString(){
return this;
}
これだけらしい。EclipseでF3押して読んだが、2806行目にあった。
equalsメソッド##
等価判断・等値判断に使われることがある。
-
等値:参照しているアドレスが同じ。
==演算子で判定。 -
等価:参照しているアドレスは異なるが値は同じ。
equalsメソッドで判定。
という雑な認識。
素のequalsメソッド自体は、
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フィールドが一緒だったらヨシ!ということで……
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;
}
}
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入門第二版]
(https://www.amazon.co.jp/%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%8F%E3%81%8B%E3%82%8BJava%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%83%E3%82%AD%E3%83%AA%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%AD%E5%B1%B1-%E6%B8%85%E5%96%AC/dp/484433638X)
Pp.541-551