今、このようなコードがあります。
-------------------------
package testprogramm;
class Tsukareta {
public String toString() {
return "どうしてもこの文字が?";
}
}
-------------------------
と、
-------------------------
package testprogramm;
class Equalityoperator {
public static void main(String[] args) {
Tsukareta mag1 = new Tsukareta();
Tsukareta mag2 = new Tsukareta();
System.out.println("mag1:" + mag1);
System.out.println("mag2:" + mag2);
System.out.println("mag1 == mag2->" + (mag1 == mag2));
System.out.println("mag1.equals(mag2)->" + mag1.equals(mag2));
}
}
-------------------------
の、2つのJavaファイルです。mainメソッドのあるEqualityoperatorクラスの方を実行すると、
-----------------------
mag1:どうしてもこの文字が?
mag2:どうしてもこの文字が?
mag1 == mag2->false
mag1.equals(mag2)->false
-----------------------
という結果が出力されます。
System.out は、java.io.PrintStream というクラスのインスタンスです。
https://docs.oracle.com/javase/jp/6/api/java/lang/System.html#out
java.io.PrintStream#print(Object) は、その引数の String#valueOf(Object) の結果を返します。
https://docs.oracle.com/javase/jp/6/api/java/io/PrintStream.html#print(java.lang.Object)
java.lang.String#valueOf(Object) は、以下のような処理をします。
https://docs.oracle.com/javase/jp/6/api/java/lang/String.html#valueOf(java.lang.Object)
引数が null の場合は、"null" に等しい文字列。そうでない場合は、obj.toString() の値
toString() メソッドは、全てのクラスの基底クラスである Object クラスに実装があります。
自前で定義しない限り、以下のような値を返します。
https://docs.oracle.com/javase/jp/6/api/java/lang/Object.html#toString()
Object クラスの toString メソッドは、オブジェクトの派生元のクラス名、アットマーク (@)、およびオブジェクトのハッシュコードの符号なし 16 進表現から構成される文字列を返します。つまり、このメソッドは次の値と等しい文字列を返します。
getClass().getName() + '@' + Integer.toHexString(hashCode())
ここでTsukaretaクラスの方を、
-------------------------
package testprogramm;
class Tsukareta {
public String naze() {
return "どうしてもこの文字が?";
}
}
-------------------------
と、適当にnazeメソッドというものに変更してみます。(Eclipse上でエラーなくコンパイルできます)
その後、Equalityoperatorクラスのmainメソッドを実行すると、
-------------------------
mag1:testprogramm.Tsukareta@532760d8
mag2:testprogramm.Tsukareta@57fa26b7
mag1 == mag2->false
mag1.equals(mag2)->false
-------------------------
と、全く違う結果が出てくるのです。
「@532760d8」「@57fa26b7」の8桁の文字列は、おそらくJavaのメモリの領域を確保したときの領域を示す?ものだと思うのですが。
なぜtoStringメソッドを使ったときはreturn文の文字列が出てきて、その他のnaze等の変数を使ったメソッドでは8桁の文字列が出てきたのか、その理由が知りたいです。
調べても考えてもわからず疲れ果ててしまいまして…お力添えをいただけますと幸いです。
よろしくお願い致します。
class Tsukareta {
は、
class Tsukareta extends java.lang.Object {
と同じ意味
class Tsukareta extends java.lang.Object { public String toString() { return "どうしてもこの文字が?"; } }
と書くと、親クラスの「toString()」をオーバーライト(上書き)することになる。
toString()自体がない場合は、親クラスのtoString()がそのまま呼ばれる。
■
System.out.println()
は、
java.lang.System.out.println()
と同じ。
https://docs.oracle.com/javase/jp/7/api/index.html?java/lang/System.html
>outって定数みたいなやつだったんですね
クラスの定義をみればわかると思う。