【问题标题】:Is toString() called when a reference of String class is printed in JAVA? [duplicate]在 JAVA 中打印 String 类的引用时是否调用 toString()? [复制]
【发布时间】:2017-07-28 14:08:54
【问题描述】:

当打印除字符串以外的任何其他类型的引用时,输出是类的名称以及 HashCode / 其 toString() 方法返回的字符串。但是当打印一个字符串的引用时,会显示实际的“字符串值”,在这种情况下是否调用了 toString() ?

【问题讨论】:

  • 是的,如果你的类只有一个字符串字段,它将被当作字符串处理。
  • bcoz String 覆盖 toString()
  • 你能显示输出的代码或示例吗?
  • 检查 Object 类上的 toString() 方法,它对 String 类的 toString() 方法有不同的实现。
  • System 是一个类,带有一个静态字段 out,类型为 PrintStream。所以你正在调用 PrintStream 的 println(Object) 方法。

标签: java string reference


【解决方案1】:

没有。如果您查看the source code for println(String),您会看到:

public void println(String x) {
    synchronized (this) {
        print(x);
        newLine();
    }
}

这个和通用的Object-signature 版本的唯一区别是String.valueOf 没有被调用:

public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}

String.valueOf 是包含对toString 的调用的方法:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

如果您对诸如此类的细节感到好奇,您应该习惯于浏览 JDK 的源文件。

【讨论】:

  • stackoverflow.com/questions/17051481/… 的完全相同的副本
  • @sForSujit 是不是有些微妙的不同?这个问题是“toString 是如何调用Objects 的?”这个问题是“is toString 要求Strings?”
  • 我很困惑。如果 toString() 没有被调用,那么字符串值如何显示?
  • @shOm 字符串是一个字符序列。这是您可以打印的唯一内容。当您尝试打印一个对象时,它会将该对象隐式转换为一个字符序列,以便可以打印它。当该对象已经是一个字符序列时,它不需要做任何事情。
  • @Michael,我按照你说的做,但是,我们没有将字符串的实际对象传递给 println(),而是传递了它们的引用,不是吗?
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 2016-12-20
  • 2011-07-26
  • 2015-04-12
  • 2016-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多