#pragma twice

KAB-studio > プログラミング > Javaのオブジェクト指向入門 > 5. 継承で拡張しよう > 5.2 継承で機能を加える
 
前のページへつぎ

5.2 継承で機能を加える

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

フィールド・メソッドを追加する

 継承を使うと、クラスにフィールドやメソッドを追加することができます

// AddedSubRunner.java

/**
 * 普通のクラス。
 * (SuperClassと全く同じクラスです)
 */
class NormalSuper
{
    // int型変数のdataフィールドです。
    int data;

    /**
     * フィールドを出力するメソッドです。
     */
    void printData()
    {
        System.out.println( data );
    }
}

/**
 * NormalSuperクラスから継承した、サブクラス。
 * フィールドとメソッドを追加しています。
 */
class AddedSub extends NormalSuper
{
    // int型変数のdataSubフィールドです。
    int dataSub;

    /**
     * フィールドを出力するメソッドです。
     */
    void printDataSub()
    {
        // このクラスで追加したフィールドを出力。
        System.out.println( dataSub );

        // ついでにスーパークラスのフィールドも出力。
        System.out.println( data );
    }
}

/**
 * 実行用クラス。このクラスを実行してください。
 */
class AddedSubRunner
{
    public static void main( String[] args )
    {
        // インスタンスを1つ作り数値を入れます。
        AddedSub ref = new AddedSub();
        // スーパークラスのフィールドに値を入れて出力します。
        ref.data = 100;
        ref.printData();
        // 出力結果:
        // 100

        // サブクラスのフィールドに値を入れて出力します。
        ref.dataSub = 200;
        ref.printDataSub();
        // 出力結果:
        // 200
        // 100
    }
}
// AddedSubRunner.java
/**
 * 普通のクラス。
 * (SuperClassと全く同じクラスです)
 */
class NormalSuper
{
	// int型変数のdataフィールドです。
	int data;
	/**
	 * フィールドを出力するメソッドです。
	 */
	void printData()
	{
		System.out.println( data );
	}
}
/**
 * NormalSuperクラスから継承した、サブクラス。
 * フィールドとメソッドを追加しています。
 */
class AddedSub extends NormalSuper
{
	// int型変数のdataSubフィールドです。
	int dataSub;
	/**
	 * フィールドを出力するメソッドです。
	 */
	void printDataSub()
	{
		// このクラスで追加したフィールドを出力。
		System.out.println( dataSub );
		// ついでにスーパークラスのフィールドも出力。
		System.out.println( data );
	}
}
/**
 * 実行用クラス。このクラスを実行してください。
 */
class AddedSubRunner
{
	public static void main( String[] args )
	{
		// インスタンスを1つ作り数値を入れます。
		AddedSub ref = new AddedSub();
		// スーパークラスのフィールドに値を入れて出力します。
		ref.data = 100;
		ref.printData();
		// 出力結果:
		// 100
		// サブクラスのフィールドに値を入れて出力します。
		ref.dataSub = 200;
		ref.printDataSub();
		// 出力結果:
		// 200
		// 100
	}
}

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

/**
 * 普通のクラス。
 * (SuperClassと全く同じクラスです)
 */
class NormalSuper
{
    // int型変数のdataフィールドです。
    int data;

    /**
     * フィールドを出力するメソッドです。
     */
    void printData()
    {
        System.out.println( data );
    }
}
/**
 * 普通のクラス。
 * (SuperClassと全く同じクラスです)
 */
class NormalSuper
{
	// int型変数のdataフィールドです。
	int data;
	/**
	 * フィールドを出力するメソッドです。
	 */
	void printData()
	{
		System.out.println( data );
	}
}

 これは前ページのSuperClassと中身は全く同じです。
 このクラスはフィールドとメソッドを持つ普通のクラスです。

 このNormalSuperクラスのサブクラス、AddedSubクラスを作ります。

/**
 * NormalSuperクラスから継承した、サブクラス。
 * フィールドとメソッドを追加しています。
 */
class AddedSub extends NormalSuper
{
    // int型変数のdataSubフィールドです。
    int dataSub;

    /**
     * フィールドを出力するメソッドです。
     */
    void printDataSub()
    {
        // このクラスで追加したフィールドを出力。
        System.out.println( dataSub );

        // ついでにスーパークラスのフィールドも出力。
        System.out.println( data );
    }
}
/**
 * NormalSuperクラスから継承した、サブクラス。
 * フィールドとメソッドを追加しています。
 */
class AddedSub extends NormalSuper
{
	// int型変数のdataSubフィールドです。
	int dataSub;
	/**
	 * フィールドを出力するメソッドです。
	 */
	void printDataSub()
	{
		// このクラスで追加したフィールドを出力。
		System.out.println( dataSub );
		// ついでにスーパークラスのフィールドも出力。
		System.out.println( data );
	}
}

 サブクラスという点では前ページのSubClassクラスと同じです。
 違うのはフィールドとメソッドがあるということです。
 このように、サブクラスにフィールド・メソッドを持たせると、スーパークラスにフィールド・メソッドを追加することになります。

 サブクラスのインスタンスを作るとその中にスーパークラスのインスタンスが作られます。

        // インスタンスを1つ作り数値を入れます。
        AddedSub ref = new AddedSub();
		// インスタンスを1つ作り数値を入れます。
		AddedSub ref = new AddedSub();

 この時、スーパークラスのインスタンスはスーパークラスのフィールド・メソッドを持ち、サブクラスのインスタンスはサブクラスのフィールド・メソッドを持ちます

 スーパークラスのインスタンスが持っているフィールド・メソッドに加えて、サブクラスのインスタンスでも自分のフィールドとメソッドを持っています
 これら、サブクラスのフィールド・メソッドも、同じように使うことができます。

        // サブクラスのフィールドに値を入れて出力します。
        ref.dataSub = 200;
        ref.printDataSub();
        // 出力結果:
        // 200
        // 100
		// サブクラスのフィールドに値を入れて出力します。
		ref.dataSub = 200;
		ref.printDataSub();
		// 出力結果:
		// 200
		// 100

 スーパークラスのフィールド・メソッドを使うのと同じように、サブクラスのフィールド・メソッドを使うことができます。
 というか、こちらの方がむしろ自然ですね。サブクラスのフィールド・メソッドを使うのと同じように、スーパークラスのフィールド・メソッドも使うことができる、という方が正しいかもしれません。

 使う側から見ると、スーパークラスのフィールド・メソッドも、サブクラスのフィールド・メソッドも同じように使うことができます
 それはつまり、スーパークラスにサブクラスのフィールド・メソッドを追加したように見える、ということです。

 これが継承のメリットです。
 つまり、継承を使うとあるクラスにフィールド・メソッドを追加できるということです。
 この継承の機能がないと、スーパークラスにあたるクラスをコピペして、そこにフィールド・メソッドを書き足すことになります。そうすると同じプログラムがどんどん増えることになります。無駄が増えることになりますし、コピペした部分にミスがあると全部修正しなければなりません。
 つまり、継承を使うことでプログラムの使い回しが簡単にできるということです。まずは継承のメリットとして、この機能を使ってみましょう。

5.2 継承で機能を加える
このページは、Java言語を用いたオブジェクト指向プログラミングのチュートリアル解説を行う「Javaのオブジェクト指向入門」の一ページです。
詳しい説明は「Javaのオブジェクト指向入門」目次をご覧ください。