#pragma twice

KAB-studio > プログラミング > Javaのオブジェクト指向入門 > 5. 継承で拡張しよう > 5.3 オーバーライドで「上書き」する
 
前のページへつぎ

5.3 オーバーライドで「上書き」する

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

オーバーライド

 前ページでは、サブクラスでフィールド・メソッドを追加できることを説明しました。
 では、追加したのが同じ名前の場合、どうなるでしょう

// OverridedSubRunner.java

/**
 * 普通のクラス。
 * メソッド1つ持ちます。
 */
class HasOneMethodSuper
{
    /**
     * 自クラスの名前を出力するメソッドです。
     */
    void printMyName()
    {
        System.out.println( "HasOneMethodSuper" );
    }
}

/**
 * HasOneMethodSuperクラスから継承した、サブクラス。
 * メソッドを追加しています。
 */
class OverridedSub extends HasOneMethodSuper
{
    /**
     * 自クラスの名前を出力するメソッドです。
     * オーバーライドしています。
     */
    void printMyName()
    {
        System.out.println( "OverridedSub" );
    }
}

/**
 * 実行用クラス。このクラスを実行してください。
 */
class OverridedSubRunner
{
    public static void main( String[] args )
    {
        // インスタンスを1つ作ります。
        OverridedSub ref = new OverridedSub();

        // printMyName()メソッドを呼び出します。
        ref.printMyName();
        // 出力結果:
        // OverridedSub
    }
}
// OverridedSubRunner.java
/**
 * 普通のクラス。
 * メソッド1つ持ちます。
 */
class HasOneMethodSuper
{
	/**
	 * 自クラスの名前を出力するメソッドです。
	 */
	void printMyName()
	{
		System.out.println( "HasOneMethodSuper" );
	}
}
/**
 * HasOneMethodSuperクラスから継承した、サブクラス。
 * メソッドを追加しています。
 */
class OverridedSub extends HasOneMethodSuper
{
	/**
	 * 自クラスの名前を出力するメソッドです。
	 * オーバーライドしています。
	 */
	void printMyName()
	{
		System.out.println( "OverridedSub" );
	}
}
/**
 * 実行用クラス。このクラスを実行してください。
 */
class OverridedSubRunner
{
	public static void main( String[] args )
	{
		// インスタンスを1つ作ります。
		OverridedSub ref = new OverridedSub();
		// printMyName()メソッドを呼び出します。
		ref.printMyName();
		// 出力結果:
		// OverridedSub
	}
}

 まず、フツーのクラス、HasOneMethodSuperクラスがあります。

/**
 * 普通のクラス。
 * メソッド1つ持ちます。
 */
class HasOneMethodSuper
{
    /**
     * 自クラスの名前を出力するメソッドです。
     */
    void printMyName()
    {
        System.out.println( "HasOneMethodSuper" );
    }
}
/**
 * 普通のクラス。
 * メソッド1つ持ちます。
 */
class HasOneMethodSuper
{
	/**
	 * 自クラスの名前を出力するメソッドです。
	 */
	void printMyName()
	{
		System.out.println( "HasOneMethodSuper" );
	}
}

 このクラスはメソッドを1つ持つ普通のクラスです。
 このクラスのprintMyName()メソッドは、クラス名を出力します。

 このHasOneMethodSuperクラスのサブクラス、OverridedSubクラスを作ります。

/**
 * HasOneMethodSuperクラスから継承した、サブクラス。
 * メソッドを追加しています。
 */
class OverridedSub extends HasOneMethodSuper
{
    /**
     * 自クラスの名前を出力するメソッドです。
     * オーバーライドしています。
     */
    void printMyName()
    {
        System.out.println( "OverridedSub" );
    }
}
/**
 * HasOneMethodSuperクラスから継承した、サブクラス。
 * メソッドを追加しています。
 */
class OverridedSub extends HasOneMethodSuper
{
	/**
	 * 自クラスの名前を出力するメソッドです。
	 * オーバーライドしています。
	 */
	void printMyName()
	{
		System.out.println( "OverridedSub" );
	}
}

 このクラスはprintMyName()メソッドを持っています。
 そう、スーパークラスのprintMyName()メソッドと同じ名前です
 このように、スーパークラスが持つメソッドと同じ名前・引数のメソッドをサブクラスで作ることを「オーバーライド」と言います。

 メソッドをオーバーライドしても、インスタンスの作られ方は同じです。

        // インスタンスを1つ作ります。
        OverridedSub ref = new OverridedSub();
		// インスタンスを1つ作ります。
		OverridedSub ref = new OverridedSub();

 ただ、メソッドをオーバーライドすると、オーバーライドされた側からオーバーライドした側へひもが付きます

 「ひもが付く」とどうなるかというと、オーバーライドされたメソッドを呼び出そうとすることで、自動的にオーバーライドしたメソッドが呼び出されます

        // printMyName()メソッドを呼び出します。
        ref.printMyName();
        // 出力結果:
        // OverridedSub
		// printMyName()メソッドを呼び出します。
		ref.printMyName();
		// 出力結果:
		// OverridedSub

 printMyName()メソッドはスーパークラスとサブクラスの両方にあります。
 両方にある場合、サブクラスのprintMyName()メソッドが「オーバーライドしている」ことになるので、このサブクラスのprintMyName()メソッドが呼び出されます

 これはつまり、オーバーライドしたことでメソッドを「上書き」したことになります。
 スーパークラスにあるメソッドをサブクラスで上書きすることで、スーパークラスの機能を「書き換える」わけです。

 サブクラスではスーパークラスにフィールドやメソッドを追加することができました。
 それに加え、このオーバーライドという機能を使うことでスーパークラスのメソッドを修正することができるというわけです。

5.3 オーバーライドで「上書き」する
このページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。
詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。