【问题标题】:tostring() is implicitly called... how?tostring() 被隐式调用...如何?
【发布时间】:2014-07-13 07:04:53
【问题描述】:

在下面的代码中,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);
    }
}

【问题讨论】:

  • 更加小心地格式化您的代码 - 目前这看起来很糟糕。 (并在您的问题中包含文本文本,而不仅仅是代码转储。)
  • 我已经格式化了你的代码。请在发布前在您的文本编辑器/IDE 中使用格式化程序。此外,代码中的 cmets 与地对于万智牌套牌一样重要。请解释您的代码的作用;它可以帮助我们帮助您。

标签: java tostring object-to-string


【解决方案1】:

这一行:

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

使用字符串拼接,在JLS的section 15.18.1中指定,开头为:

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

Section 5.1.11 有:

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

...

现在只需要考虑参考值:

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

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

【讨论】:

    【解决方案2】:

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

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

    此代码在.append() 中调用p.toString(),因为pObject

    指定者:
    http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html#append(java.lang.Object)

    【讨论】:

      【解决方案3】:

      这只是一项免费提供的语言功能。见Concatenating strings部分:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-24
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-23
        相关资源
        最近更新 更多