一、java.io.PrintStream.pinntln(引用类型)的源代码
传入一个引用后,会调用String类中的valueOf(Object)方法,假设这个引用时在静态方法区的“hello”的引用。
public void println(Object x) {
将"hello的内存地址"传给valueOf()
String s = String.valueOf(x);
if (getClass() == PrintStream.class) {
writeln(String.valueOf(s));
} else {
synchronized (this) {
print(s);
newLine();
}
}
}
二、 java.lang.String 类中的valueOf()方法
由于传入的“hello”的地址并非空,所以会返回"hello".toString();,而"hello"是String类型的引用,所以会调用String类中的toString()
//返回 当前对象"hello的内存地址"
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
三、 java.lang.String类中的toString()
调用toString()会返回当前对象"hello"的String引用,这个引用指向的是“hello”
public String toString() {
return this;//返回当前对象"hello的内存地址"
}
综合一、二、三,我们可以发现String.valueOf(x) 这个方法调用的返回值是“hello”的String类型的引用,再将这个引用赋值给String s
其本质就是
String s1="hello";
String s=s1;
之后看一、中的print(s)语句(前面的判断先别管),
四、java.io.PrintStream.print(String s)的源代码如下
public void print(String s) {//传入s引用保存的“hello”的内存地址
write(String.valueOf(s));
}
五、看write()
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;
}
}