tostring()被隐含地称为......怎么样?

时间:2014-07-13 07:04:54

标签: java tostring object-to-string

在以下代码中,如何隐式调用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);
    }
}

3 个答案:

答案 0 :(得分:9)

这一行:

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

使用字符串连接,它在JLS的section 15.18.1中指定,从以下开始:

  

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

Section 5.1.11有:

  

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

     

...

     

现在只需要考虑参考值:

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

  •   
  • 否则,转换的执行就好像通过调用引用对象的toString方法而没有参数一样;但如果调用toString方法的结果为null,则会改为使用字符串"null"

  •   

答案 1 :(得分: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)

答案 2 :(得分:0)

这只是一种免费提供的语言功能。请参阅Concatenating strings部分:

  

这种连接可以是任何对象的混合。对于不是String的每个对象,调用其toString()方法将其转换为String。