#pragma twice

KAB-studio > プログラミング > Javaのオブジェクト指向入門 > 8. ポリモーフィズムQ and A > 8.2 Objectクラスってなに?
 
前のページへつぎ

8.2 Objectクラスってなに?

del.icio.us 登録する はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数 livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数 Yahoo!ブックマーク 詳細を表示 users RSSに登録
更新日: 2008/04/19
動作確認環境:Windows XP Professional SP2, Java SE 5

Objectクラス?

 質問:APIリファレンスを見ると、どのクラスも「Object」っていうクラスがスーパークラスになっているんだけど、このクラスって何?
 解答:すべてのクラスのスーパークラスです。

 APIリファレンスを見てみると、すべてのクラスがObjectクラスから継承されています。

 このクラスは非常に特殊なクラスで、普通にクラスを作っただけでこのクラスから継承したことになります
 そのため、ありとあらゆるクラスは「Objectクラスのサブクラス」ということになります。
 それを実際に確認してみましょう。

// 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
    }
}
// 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クラスの参照型変数とインスタンスを作ります。
        ObjectInherited ref = new ObjectInherited();
		// ObjectInheritedクラスの参照型変数とインスタンスを作ります。
		ObjectInherited ref = new ObjectInherited();

 このようにObjectInheritedクラスのインスタンスを作成すると、Objectクラスのインスタンスも作られて、中に入れられる形になります。

 そのため、Objectクラスが持つメソッドを呼び出すことができます。

        // ObjectクラスのtoString()メソッドを呼び出します。
        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クラスにアップキャストします。
        Object obj = ref;
		// Objectクラスにアップキャストします。
		Object obj = ref;

 Objectクラスがスーパークラスになるので、Objectクラスの参照型変数に参照を入れることができます。

 この「Objectクラスが自動的にスーパークラスになる」という機能は、実はいたるところで使われています。
 System.out.println()メソッドにどんなクラスでも渡せるのもそうですし、また、J2SE(つまりJava5より前)のコレクションクラスで要素の型がObjectクラスだったのもこのためです。

8.2 Objectクラスってなに?
このページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。
詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。