我正在研究将char原始值连接起来形成一个字符串,并且发现了这篇文章:
Concatenate chars to form String in java
我知道产生最终String值的正确方法是使用toString()方法,如果我不使用这个方法,我仍然得到相同的输出。我原以为下面的代码会输出对象sb的堆地址,但它仍会打印'ice'。
谢谢。
public class CharsToString {
public static void main (String args[]) {
char a, b, c;
a = 'i';
b = 'c';
c = 'e';
StringBuilder sb = new StringBuilder();
sb.append(a);
sb.append(b);
sb.append(c);
System.out.println(sb);
}
}
答案 0 :(得分:3)
您需要查看System.out.println(sb);
实际执行的操作。
它在类java.io.PrintStream
中调用此方法。 (因为StringBuilder扩展了Object)
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
并String.valueOf(x)
调用toString()
上的StringBuilder
方法。
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
答案 1 :(得分:1)
自动调用StringBuilder对象的toString()方法。
答案 2 :(得分:0)
如果您在System.out.println(Object obj);
来电System.out
上检查PrintStream
println( Object obj )
是PrintStream
和String.valueOf( Object )
,
对象上的String.valueOf( Object )
调用toString()
,因此间接System.out.println( StringBuilder sb )
调用StringBuilder
的{{1}},
现在,如果您的对象不是toString()
,而且没有StringBuilder
,则会打印toString()
答案 3 :(得分:0)
这是因为方法toString()
是隐式调用的。
每次,当您尝试打印对象时,它会查找toString()方法。
在这种情况下,println
方法接受Object并调用String.valueOf(Object o),它返回Object的String值。
答案 4 :(得分:0)
System.out是一个PrintStream类。所以你看一下这个类的println(Object)的javadoc,你会得到答案:https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html#println-java.lang.Object-。简而言之,如果使用非原始参数而不是String调用方法println,它将打印对象的toString()方法的输出。因此,在您的情况下,调用System.out.println(sb.toString());
和System.out.println(sb);
会有相同的结果