在String类中混淆toString()实现(源代码)

时间:2016-07-05 06:43:41

标签: java tostring

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"。为什么会发生这种情况?

3 个答案:

答案 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()

sString,因此System.out.println(String)被调用;没有toString

输出字符串内容的原因是System.out.println(String)用于打印字符串的内容。

  

打印String引用变量应打印引用变量的地址(因为toString()返回&#39; this&#39;)

没有。您在某些对象上调用java.lang.Object@15db9742时看到toString或类似内容的原因是toStringObject的实现会返回该格式的字符串(注意:它&#39;不是对象的地址)。但像String这样的类覆盖toString以返回更多有用的字符串,当然在String的情况下,最有用的字符串toString可以返回字符串本身。< / p>

答案 2 :(得分:1)

toString()应返回任何对象的 a 字符串表示形式(因此它存在于java.lang.Object上)。

在字符串对象上调用时,该字符串的字符串表示形式是猜测...字符串本身;因此toString()返回字符串本身。