10 、基本的な Java プログラム - 継承、オーバーライドの利用 -
技術情報 TOP へ


作業の準備

簡単な Java プログラムを作成して動かしてみます。まずは下記の作業準備を行ってください。

( 1 ) JDK がインストールされていることを確認します。
* java コマンド及び javac コマンドが正常に動作することを確認してください。

( 2 ) 適当な作業用フォルダを作成します。
ここでは、 C:\work という作業用ディレクトリを作成しました。


( 3 ) 任意のテキストエディタを用意してください。

( 4 ) コマンドプロンプトを開きます。

* 本ページでは、テキストエディタでプログラムを編集し、 コマンドプロンプトからコマンドでコンパイル、
実行する方法を記述していますが、 Eclipse 等のツールを使用されてもよいと思います。
テキストエディタと bat ファイルを使用することもできます。

Java のプログラム作成から実行までの順序は、「プログラム作成 - コンパイル- 実行 」となります。

・プログラム作成
プログラムを記述した ****.java ファイルの作成。

・コンパイル
javac コマンドでのコンパイル ( ****.class ファイルの生成 )。

・実行
java コマンドで作成したプログラムを実行します。




( 1 ) 継承の利用

独自のメソッドを持った独自のクラスを作成してみましょう。 プログラムは下記の MyObj クラスになります。

ファイル名:MyObj.java
public class MyObj {
	
	/*
	* コンストラクタ
	*/
	public MyObj(){
		System.out.println("Constructor !");
	}	

	public String getMsgText(){
		return "OK!";
	}
}
上記の MyObj クラスを継承した SubObj クラスを作成します。
プログラムは下記のSubObj クラスになります。

ファイル名:SubObj.java

public class SubObj extends MyObj {

	/*
	* コンストラクタ
	*/
	public SubObj(){
	}

	public static void main(String args[]) {
		SubObj subObj = new SubObj();
	}
}
上記で作成した SubObj クラスのコンストラクタに下記の処理を追加します。

変更前

public SubObj( ){
}

変更後

public SubObj( ){
super();
System.out.println( super.getMsgText() );
}

public class SubObj extends MyObj {

	/*
	* コンストラクタ
	*/
	public SubObj(){
		super();
		System.out.println( super.getMsgText() );

	}

	public static void main(String args[]) {
		SubObj subObj = new SubObj();
	}
}

上記のプログラムの簡単な解説

SubObj クラスは MyObj クラスを継承しています。
継承は最低限の簡単な Java の基礎知識 でも説明していますが、既存のクラスをベースとしたクラスを作成することができます。
ここでは、SubObj クラスは MyObj クラスのサブクラスであり、SubObj クラスは MyObj クラスの private 以外のメソッドやメンバ変数に自クラスに記述があるかのようにアクセスできます。
super() ではスーパークラス ( ここでは MyObj クラス ) のコンストラクタを呼び出しています。
上記のプログラムを実行すると標準出力に下記のように表示されます。
Constructor !
OK!


上記のクラスをコンパイル、実行しましょう。

プログラムをコンパイルします。
cd C:\work
javac MyObj.java SubObj.java
プログラムを実行しましょう。
java SubObj
下記のように表示されれば成功です。


( 2 ) オーバーライドの使用

オーバーライドを使用してみましょう。

プログラムは下記の MyObj クラス、SubObj クラスになります。

ファイル名:MyObj.java
public class MyObj {
	
	/*
	* コンストラクタ
	*/
	public MyObj(){
		System.out.println("Constructor !");
	}	

	public String getA(){
		return "A !";
	}
	public String getB(){
		return "B !";
	}
	public String getC(){
		return "C !";
	}
	public String getD(){
		return "D !";
	}
}

ファイル名:SubObj.java

public class SubObj extends MyObj {

	/*
	* コンストラクタ
	*/
	public SubObj(){
		super();
	}

	public static void main(String args[]) {
		SubObj subObj = new SubObj();
		System.out.println( subObj.getA() );
		System.out.println( subObj.getB() );
		System.out.println( subObj.getC() );
		System.out.println( subObj.getD() );
	}
}

上記のプログラムの簡単な解説

SubObj クラスは MyObj クラスを継承しており、SubObj クラスは MyObj クラスで定義された メソッドを利用しています。
上記のプログラムの実行結果は下記のようになります。

Constructor !
A !
B !
C !
D !

しかし、ここで SubObj クラスは getA メソッドで MyObj クラスの getA メソッドが返却する値ではなく、
SubObj クラスに特化した処理を行い、特化した値を返却したいと考えています。


MyObj クラスの getA メソッドを変更してしますと、
他に MyObj クラスの継承を行っている クラスが存在した場合、影響を与えてしまいます。
このような場合、オーバーライドを使用して getA メソッドを SubObj クラスに特化した処理に変更します。

SubObj クラスを下記のように変更しましょう。
public class SubObj extends MyObj {

	/*
	* コンストラクタ
	*/
	public SubObj(){
		super();
	}

	public static void main(String args[]) {
		SubObj subObj = new SubObj();
		System.out.println( subObj.getA() );
		System.out.println( subObj.getB() );
		System.out.println( subObj.getC() );
		System.out.println( subObj.getD() );
	}

	/* 下記のメソッドを追加します。 */
	public String getA(){
		return super.getA() + "And a";
	}
}

上記のプログラムの簡単な解説

main メソッドの処理は同じですが、SubObj クラスに getA メソッドを追加しています。
SubObj クラスの getA メソッドは SubObj クラスに特化した処理となります。
SubObj クラスの getA メソッドは MyObjd クラスの getA メソッドが返却する値に
SubObj クラス特有の処理を行っています。
ここでは super.getA() を使用していますが、全く関連の無い処理を書いもかまいません。


上記のクラスをコンパイル、実行しましょう。

プログラムをコンパイルします。
cd C:\work
javac MyObj.java MyExample.java
プログラムを実行しましょう。
java MyExample
下記のように表示されれば成功です。


技術情報 TOP へ


Google
WWW を検索 whitemark.co.jp を検索
[ 株式会社ホワイトマーク TOP ]   [ 免責事項 ]

Copyright © 2006 by WhiteMark, All rights Reserved. Last Modified: 2006/05