System.out.println()の内部処理について

プリミティブ型とオブジェクト型の処理の違い

オブジェクト型の場合

javaCopyMyClass obj = new MyClass();
System.out.println(obj);
  1. println(Object obj)メソッドが呼び出される
  2. 内部でobj.toString()が呼び出される
  3. toString()の結果が出力される
  4. デフォルトではObjectクラスのtoString()が使用され、「クラス名@ハッシュコード」が出力
  5. カスタムクラスでtoString()をオーバーライドすることで、独自の文字列表現を定義可能

プリミティブ型の場合

javaCopyint num = 123;
System.out.println(num);
  1. println(int x)メソッドが呼び出される
  2. 内部でString.valueOf(x)が呼び出される
  3. String.valueOf()Integer.toString()を呼び出す
  4. プリミティブ型専用の変換アルゴリズムで文字列に変換
  5. 変換された文字列が出力される

toString()の関係性

オブジェクト型のtoString()

  • Objectクラスで定義された基本的な文字列変換メソッド
  • インスタンスメソッドとして実装
  • 各クラスでオーバーライド可能

プリミティブ型のtoString()

  • ラッパークラス(Integerなど)で定義された静的メソッド
  • プリミティブ型に最適化された実装
  • Object.toString()の概念を拡張

まとめ

  • プリミティブ型とオブジェクト型では、異なる実装のtoString()が使用される
  • ただし、両者とも同じtoString()の概念に基づいている
  • Javaは型に応じて最適化された文字列変換の仕組みを提供している
  • この設計により、一貫した文字列変換のインターフェースが実現されている

実装例

javaCopy// Object.toString()の基本実装
public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

// Integer.toString()の実装(プリミティブ型用)
public static String toString(int i) {
    if (i == 0) return "0";
    // 数値を文字列に変換する特殊なアルゴリズム
    // ...
}

この設計により、Javaは型の種類に関係なく、一貫した方法で文字列への変換を提供しています。プリミティブ型とオブジェクト型で異なる実装を提供しつつも、根底にある概念は同じであり、これはJavaの統一的な設計思想を反映しています。