JavaのSystem.out.println()
とtoString()
の関係は何ですか?例えば:
_public class A {
String x = "abc";
public String toString() {
return x;
}
}
public class ADemo {
public static void main(String[] args) {
A obj = new A();
System.out.println(obj);
}
}
_
メインクラスが実行されると、出力は_"abc"
_になります。 toString()
をオーバーライドするコードを削除すると、_"A@659e0bfd"
_として出力されます。では、obj
オブジェクト参照を引数として渡すときのSystem.out.println()
の動作原理を誰かが説明できますか? toString()
メソッドと完全に接続されていますか?
_System.out
_ は PrintStream
です。 Printstreamは、数値や文字列などを処理するために、println()
関数のいくつかのバージョンを定義しています。任意のオブジェクトをパラメーターとしてPrintStream.println()
を呼び出すと、 Object
に作用する関数のバージョン が得られます。このバージョンの関数
...最初にString.valueOf(x)を呼び出して、印刷されたオブジェクトの文字列値を取得します...
String.valueOf(Object)
を見ると、
引数がnullの場合、「null」に等しい文字列。それ以外の場合は、obj.toString()の値が返されます。
つまり、簡単に言うと、System.out.println(someObject)
はそのオブジェクトのtoString()
関数を呼び出して、オブジェクトを文字列表現に変換します。
オブジェクトが独自のtoString()
関数を定義している場合、それが呼び出されます。このような関数を指定しない場合、オブジェクトはその親クラスの1つからtoString()
を継承します。最悪の場合、それは Object.toString()
を継承します。そのバージョンのtoString()は、
オブジェクトがインスタンスであるクラスの名前、アットマーク文字 `@ '、およびオブジェクトのハッシュコードの符号なし16進表現で構成される文字列。
または、言い換えると:
_getClass().getName() + '@' + Integer.toHexString(hashCode())
_
したがって、独自のバージョンのtoString()を定義していないオブジェクトでSystem.out.println()
を呼び出すと、「classname @someHexNumber」のようなObject
バージョンが得られる可能性があります。
toString()
は、すべてのクラスのObject
クラス(継承ツリーのルート)に存在するメソッドです。
System.out.print()
(SOP)は、オブジェクトが供給されるとtoStringメソッドを呼び出します。
メソッドtoString()
を上書きしない場合、SOPは親toString()
を呼び出し、親がObjectクラスの場合、オブジェクトのhashCode
メソッドを上書きすると、SOPはtoString()
メソッドを呼び出します
System.out.println(obj)は、obj.toString()から返された文字列を出力します。オーバーライドしない場合は、ベースobject.toString()メソッドを呼び出します。このメソッドは、デフォルトで、クラスObjectのtoStringメソッドが次の文字列で構成される文字列を返します。オブジェクトがインスタンスであるクラスの名前、アットサイン文字 `@ '、およびオブジェクトのハッシュコードの符号なし16進表現。つまり、このメソッドは次の値に等しい文字列を返します。
getClass().getName() + '@' + Integer.toHexString(hashCode())