0

在下面的代码中,如何toString()隐式调用 is?

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 节中指定的字符串连接,从以下内容开始:

如果只有一个操作数表达式是字符串类型,则对另一个操作数执行字符串转换(第 5.1.11 节)以在运行时生成字符串。

第 5.1.11 节有:

任何类型都可以String通过字符串转换为类型。

...

现在只需要考虑参考值:

  • 如果引用为null,则将其转换为字符串"null"(四个 ASCII 字符 n、u、l、l)。

  • 否则,转换就像通过调用toString不带参数的引用对象的方法一样执行;但如果调用toString方法的结果是null,则使用字符串"null"代替。

于 2014-07-13T07:10:42.050 回答
2

您正在调用"p is " + p,它实际上被编译为

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

此代码按原样调用p.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 回答