2016-08-08 7 views
1

私は文字列を形成するためのcharプリミティブ値を連結に関する研究を行うと、この記事に出くわした:Stringに文字を連結 - のStringBuilderのアペンド()を使用して

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はあなたのためにそれを行います。 2つの単純なクラスを作成することができます.1つはtoString、2つ目はwithout、そしてprintlnはbouthのインスタンスを呼び出します。 –

答えて

3

System.out.println(sb);が実際に何を見ている必要があります。 このメソッドは、java.io.PrintStreamクラスで呼び出されます。

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

(のStringBuilderオブジェクトを拡張するため)そして、あなたのStringBuildertoString()メソッドを呼び出しますString.valueOf(x)

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

非常に詳細な答えを入力していただきありがとうございます。 – soti84

1

StringBuilderオブジェクトのtoString()メソッドは自動的に暗黙的に呼び出されます。

0

あなたがSystem.out.println(Object obj);System.outを確認した場合には、今の場合、オブジェクトのString.valueOf(Object)通話toString()ので、間接的にSystem.out.println(StringBuilder sb)通話StringBuilderさんtoString()

PrintStream通話String.valueOf(Object)PrintStreamprintln(Object obj)ですオブジェクトがStringBuilder以外で、toString()がない場合、それは印刷されますgetClass().getName() + "@" + Integer.toHexString(hashCode());

0

これは、方法toString()が暗黙的に呼び出されたためです。 オブジェクトを印刷しようとするたびに、toString()メソッドが検索されます。 この場合、printlnメソッドはObjectを受け入れ、ObjectのString値を返すString.valueOf(Object o)を呼び出します。

0

System.outはPrintStreamクラスです。だから、そのクラスのprintln(Object)のjavadocを見れば、答えは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);を呼び出すと、同じ結果になります

関連する問題