java.lang.String中toString()的重写代码如下:
public String toString(){
return this;
}
因此,打印String引用变量应该打印引用变量的地址(因为toString()返回'这个')但不是字符串文字。为什么我错了?
例如,考虑代码
class Sample
{
String s="dummy";
System.out.println(s);//implicit call to toString()
}
根据toString()源代码中的逻辑,应输出(变量)s的地址,输出为" dummy"。为什么会发生这种情况?
答案 0 :(得分:5)
查看System.out.println
代码,它没有使用toString
,但它写了一个从String中检索到的char []:
public void write(String str, int off, int len) throws IOException {
synchronized (lock) {
char cbuf[];
if (len <= WRITE_BUFFER_SIZE) {
if (writeBuffer == null) {
writeBuffer = new char[WRITE_BUFFER_SIZE];
}
cbuf = writeBuffer;
} else { // Don't permanently allocate very large buffers.
cbuf = new char[len];
}
str.getChars(off, (off + len), cbuf, 0);
write(cbuf, 0, len);
}
}
在上述方法之前println
的调用堆栈(位于Writer
中):
<强> PrintStream的强>:
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}
public void print(String s) {
if (s == null) {
s = "null";
}
write(s);
}
private void write(String s) {
try {
synchronized (this) {
ensureOpen();
textOut.write(s);
textOut.flushBuffer();
charOut.flushBuffer();
if (autoFlush && (s.indexOf('\n') >= 0))
out.flush();
}
}
catch (InterruptedIOException x) {
Thread.currentThread().interrupt();
}
catch (IOException x) {
trouble = true;
}
}
<强>作家强>:
public void write(String str) throws IOException {
write(str, 0, str.length());
}
答案 1 :(得分:4)
首先,在此代码中没有对toString
的隐式调用:
String s="dummy";
System.out.println(s); // <== No implicit call to toString()
s
是String
,因此System.out.println(String)
被调用;没有toString
。
输出字符串内容的原因是System.out.println(String)
用于打印字符串的内容。
打印String引用变量应打印引用变量的地址(因为toString()返回&#39; this&#39;)
没有。您在某些对象上调用java.lang.Object@15db9742
时看到toString
或类似内容的原因是toString
中Object
的实现会返回该格式的字符串(注意:它&#39;不是对象的地址)。但像String
这样的类覆盖toString
以返回更多有用的字符串,当然在String
的情况下,最有用的字符串toString
可以返回字符串本身。< / p>
答案 2 :(得分:1)
toString()应返回任何对象的 a 字符串表示形式(因此它存在于java.lang.Object上)。
在字符串对象上调用时,该字符串的字符串表示形式是猜测...字符串本身;因此toString()返回字符串本身。