Objectクラス?
質問:APIリファレンスを見ると、どのクラスも「Object」っていうクラスがスーパークラスになっているんだけど、このクラスって何?
解答:すべてのクラスのスーパークラスです。
APIリファレンスを見てみると、すべてのクラスがObjectクラスから継承されています。
このクラスは非常に特殊なクラスで、普通にクラスを作っただけでこのクラスから継承したことになります。
そのため、ありとあらゆるクラスは「Objectクラスのサブクラス」ということになります。
それを実際に確認してみましょう。
/**
* フィールドもメソッドも持たないクラス。
*/
class ObjectInherited
{
}
/**
* 実行用クラス。このクラスを実行してください。
*/
class ObjectInheritedRunner
{
public static void main( String[] args )
{
// ObjectInheritedクラスの参照型変数とインスタンスを作ります。
ObjectInherited ref = new ObjectInherited();
// ObjectクラスのtoString()メソッドを呼び出します。
String str = ref.toString();
System.out.println( str );
// 出力結果:
// ObjectInherited@3901c6
// Objectクラスにアップキャストします。
Object obj = ref;
// ObjectクラスのtoString()メソッドを呼び出します。
str = obj.toString();
System.out.println( str );
// 出力結果:
// ObjectInherited@3901c6
}
}
// ObjectInheritedRunner.java /** * フィールドもメソッドも持たないクラス。 */ class ObjectInherited { } /** * 実行用クラス。このクラスを実行してください。 */ class ObjectInheritedRunner { public static void main( String[] args ) { // ObjectInheritedクラスの参照型変数とインスタンスを作ります。 ObjectInherited ref = new ObjectInherited(); // ObjectクラスのtoString()メソッドを呼び出します。 String str = ref.toString(); System.out.println( str ); // 出力結果: // ObjectInherited@3901c6 // Objectクラスにアップキャストします。 Object obj = ref; // ObjectクラスのtoString()メソッドを呼び出します。 str = obj.toString(); System.out.println( str ); // 出力結果: // ObjectInherited@3901c6 } }
このプログラムのObjectInheritedクラスは、フィールドもメソッドも持たない、なんにもないクラスです。
* フィールドもメソッドも持たないクラス。
*/
class ObjectInherited
{
}
/** * フィールドもメソッドも持たないクラス。 */ class ObjectInherited { }
ところが実は、このクラスはObjectクラスのサブクラスです。
継承をしなくても、すべてのクラスは自動的にObjectクラスから継承してしまうのです。
そのため、ObjectInheritedクラスのインスタンスを作成すると、その中にObjectクラスのインスタンスが作成される形になります。
ObjectInherited ref = new ObjectInherited();
// ObjectInheritedクラスの参照型変数とインスタンスを作ります。 ObjectInherited ref = new ObjectInherited();
このようにObjectInheritedクラスのインスタンスを作成すると、Objectクラスのインスタンスも作られて、中に入れられる形になります。
そのため、Objectクラスが持つメソッドを呼び出すことができます。
String str = ref.toString();
System.out.println( str );
// 出力結果:
// ObjectInherited@3901c6
// ObjectクラスのtoString()メソッドを呼び出します。 String str = ref.toString(); System.out.println( str ); // 出力結果: // ObjectInherited@3901c6
ObjectInheritedクラスはフィールドもメソッドも持っていません。
ですが、Objectクラスから継承しているので、ObjectクラスのtoString()メソッドを呼び出せる、というわけです。
また、Objectクラスにアップキャストすることもできます。
Object obj = ref;
// Objectクラスにアップキャストします。 Object obj = ref;
Objectクラスがスーパークラスになるので、Objectクラスの参照型変数に参照を入れることができます。
この「Objectクラスが自動的にスーパークラスになる」という機能は、実はいたるところで使われています。
System.out.println()メソッドにどんなクラスでも渡せるのもそうですし、また、J2SE(つまりJava5より前)のコレクションクラスで要素の型がObjectクラスだったのもこのためです。