プリミティブ型とオブジェクト型の処理の違い
オブジェクト型の場合
javaCopyMyClass obj = new MyClass();
System.out.println(obj);
println(Object obj)
メソッドが呼び出される- 内部で
obj.toString()
が呼び出される toString()
の結果が出力される- デフォルトでは
Object
クラスのtoString()
が使用され、「クラス名@ハッシュコード」が出力 - カスタムクラスで
toString()
をオーバーライドすることで、独自の文字列表現を定義可能
プリミティブ型の場合
javaCopyint num = 123;
System.out.println(num);
println(int x)
メソッドが呼び出される- 内部で
String.valueOf(x)
が呼び出される String.valueOf()
はInteger.toString()
を呼び出す- プリミティブ型専用の変換アルゴリズムで文字列に変換
- 変換された文字列が出力される
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の統一的な設計思想を反映しています。