Javaの勉強をちまちま続けてきて、疑問にぶつかった。疑問というか、なんでそういう風になるのかな?というちょっとしたことなんだけど。
例えば以下のようなソースで、最終的な出力は、
class Cls{
String name;
int age;
name = "太郎";
age = 33;
public String toString(){
return "名前:" + name + " " + "年齢:" + age;
}
public static void main(String[] args){
Cls cls = new Cls();
System.out.println(cls);
}
}
名前:太郎 年齢:33
というように、toString()メソッドを明示的に呼んでないのに呼び出されている。ほかのメソッドであれば、「cls.XXXX( )」という風に明示しないとダメなはず。
これは、「@Override」という記述について初めて触れた時に、検索して出てきたコードでtoStringが呼び出されていないのに実行されているのを見て、不思議に思ったのですが。
もちろん明示的にtoStringとしても処理は当然通るのだけど、なぜtoStringだけ特別っぽい扱いなのだろうか。というか、toStringだけがこんな特別扱いなのか?
以下、引用
toStringメソッドとは
toStringメソッドは、インスタンスの文字列表現を返すメソッドである。その文字列は「クラス名@ハッシュコード」のような形式であり、具体的には「PhoneNumber@163b91」となる(正確には
getClass().getName() + '@' + Integer.toHexString(hashCode())
と等しい値を返す)。toStringメソッドは、java.lang.Objectに実装されているメソッドであり、Javaの実装では全てのクラスがjava.lang.Objectを継承しているため、全てのクラスでtoStringメソッドを呼び出すことが出来る。
なるほど・・・toStringはjava.lang.Objectに実装されているのか。また、以下のようにもなっている。
toStringメソッドはこのオブジェクトを「テキストで表現する」文字列を返します。この結果は、人間が読める簡潔で有益な情報であるべきです。すべてのサブクラスで、このメソッドをオーバーライドすることをお勧めします。
だから参考にしたソースには「@Override」でされていたのか。最初のソースを直すと以下のようになる。
class Cls{
String name;
int age;
name = "太郎";
age = 33;
@Override
public String toString(){
return "名前:" + name + " " + "年齢:" + age;
}
public static void main(String[] args){
Cls cls = new Cls();
System.out.println(cls);
}
}
この件についてはまだ勉強が必要だな~。
- 作者: きしだなおき,のざきひろふみ,吉田真也,菊田洋一,渡辺修司,伊賀敏樹
- 出版社/メーカー: 技術評論社
- 発売日: 2014/12/11
- メディア: Kindle版
- この商品を含むブログ (1件) を見る