web-dev-qa-db-ja.com

Java)の「System.out.println()」と「toString()」の間の接続

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()メソッドと完全に接続されていますか?

13
anisotropic

_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バージョンが得られる可能性があります。

14
Kenster

toString()は、すべてのクラスのObjectクラス(継承ツリーのルート)に存在するメソッドです。

System.out.print()(SOP)は、オブジェクトが供給されるとtoStringメソッドを呼び出します。

メソッドtoString()を上書きしない場合、SOPは親toString()を呼び出し、親がObjectクラスの場合、オブジェクトのhashCode

メソッドを上書きすると、SOPはtoString()メソッドを呼び出します

3
CMPS

System.out.println(obj)は、obj.toString()から返された文字列を出力します。オーバーライドしない場合は、ベースobject.toString()メソッドを呼び出します。このメソッドは、デフォルトで、クラスObjectのtoStringメソッドが次の文字列で構成される文字列を返します。オブジェクトがインスタンスであるクラスの名前、アットサイン文字 `@ '、およびオブジェクトのハッシュコードの符号なし16進表現。つまり、このメソッドは次の値に等しい文字列を返します。

 getClass().getName() + '@' + Integer.toHexString(hashCode())
0
sam schonstal