0

次のコードで、 はどのようにtoString()暗黙的に呼び出されますか?

class Payload {
    private int weight;
    public Payload (int w) {
        weight = w; 
    }
    public void setWeight(int w) {
        weight = w; 
    }
    public String toString() {
        return Integer.toString(weight); 
    }
}

public class testpayload {
    static void changePayload(Payload p) {
        p.setWeight(420);
    } 
    public static void main(String[] args) {
        Payload p = new Payload(200);
        p.setWeight(1024);
        changePayload(p);
        System.out.println("p is " + p);
    }
}
4

3 に答える 3

9

この行:

System.out.println("p is " + p);

JLS のセクション 15.18.1で指定されている文字列連結を使用します。

1 つのオペランド式のみが String 型である場合、文字列変換 (§5.1.11) がもう一方のオペランドに対して実行され、実行時に文字列が生成されます。

セクション 5.1.11には次の内容があります。

任意の型はString、文字列変換によって型に変換できます。

...

ここで、参照値のみを考慮する必要があります。

  • 参照が の場合、文字列(4 つの ASCII 文字 n、u、l、l) にnull変換されます。"null"

  • それ以外の場合、変換はtoString、参照先オブジェクトのメソッドを引数なしで呼び出した場合と同様に実行されます。toStringただし、メソッドを呼び出した結果が の場合はnull、代わりに文字列"null"が使用されます。

于 2014-07-13T07:10:42.050 に答える
2

を呼び出していますが"p is " + p、これは事実上コンパイルされます

new StringBuffer("p is").append(p)

このコードはas isp.toString()内で呼び出します。.append()pObject

仕様:
http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html#append(java.lang.Object)

于 2014-07-13T07:09:48.513 に答える
0

これは無料で利用できる単なる言語機能です。文字列の連結セクションを参照してください。

このような連結は、任意のオブジェクトの混合である可能性があります。String ではないオブジェクトごとに、その toString() メソッドが呼び出されて String に変換されます。

于 2014-07-13T07:12:18.137 に答える