2016-08-08 38 views
1

我上串联字符的原始值,形成一个String做研究和跨此帖一:串联字符的字符串 - 使用的StringBuilder的append()

Concatenate chars to form String in java

据我了解,生产的正确方法最后的String值是使用toString()方法,那么如果我不使用这个方法,我仍然会得到相同的输出。我原以为下面的代码会输出对象sb的堆地址,但它仍然会打印'冰'。

谢谢。

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

System.out.println(sb)等于System.out.println(sb.toString());. JVM会为你做。你可以创建两个简单的类:一个实现了toString,第二个没有,并且调用println来实现bouth实例。 –

回答

3

你需要看看System.out.println(sb);实际上做了什么。 它在这个类中调用java.io.PrintStream这个方法。 (因为一个StringBuilder扩展对象)

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

而且,String.valueOf(x)呼吁你StringBuildertoString()方法。

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

非常感谢大家的意见和MrSmith42的特别回答。 – soti84

1

StringBuilder对象的toString()方法自动被隐式调用。

0

如果检查System.out.println(Object obj);System.outPrintStreamprintln(Object obj)PrintStream电话String.valueOf(Object)

String.valueOf(Object)电话toString()的对象,所以间接System.out.println(StringBuilder sb)电话StringBuildertoString()

现在,如果您的对象不是StringBuilder,它没有toString(),它会打印getClass().getName() + "@" + Integer.toHexString(hashCode());

0

这是因为方法toString()被隐式调用。 每次尝试打印对象时,都会查找toString()方法。 在这种情况下,println方法接受Object并调用返回Object的String值的String.valueOf(Object o)。

0

System.out是一个PrintStream类。所以你看看javadoc for println(Object),你会得到你的答案:https://docs.oracle.com/javase/8/docs/api/java/io/PrintStream.html#println-java.lang.Object-。简而言之,如果你调用方法println的参数不是原始的,而不是一个字符串,它会打印你的对象的toString()方法的输出。所以在你的情况下,调用System.out.println(sb.toString());System.out.println(sb);将具有相同的结果

相关问题