Java入門 第8回 継承とオーバーライド

■Javaの壁?
クラスの基本については理解できたでしょうか。
前回までに作ったクラスをおさらいしてみましょう。
・会員クラス
class Kaiin{
	//フィールドはprivateにしました
	private String name;
	private String address;
	//セッター	
	public void setName(String name){
		this.name = name;
	}
	public void setAddress(String address){
		this.address = address;
	}
	//ゲッター
	public String getName(){
		return name;
	}
	public String getAddress(){
		return address;
	}
	public void disp(){//メソッドはpublicにしました
		System.out.println("名前:"+ name);
		System.out.println("住所:" + address);
	}
	
			
このクラスでは会員情報として名前と住所を持っていますが、新たに電話番号も加えて「名前・住所・電話番号」でひとまとまりとしたい場合はどうすればいいのでしょう。
3つの値を持ったクラスをもうひとつ作成することもできますが、すでに名前と住所のクラスはあるので無駄が多いですね。
Javaではクラスを拡張(extend)することができます。会員クラスを拡張して、電話番号を付け足すことができるのです。 早速ソースを見てみましょう。
class TelNo extends Kaiin{
	private String tel;
	
	public void setTel(String tel){
		this.tel = tel;
		}
	public void telDisp(){
		System.out.println("電話:" + tel);
	}
}

			
1行目に見慣れない単語が出てきました。このように書くと電話番号クラスが会員情報クラスを利用できるのです。
利用される方のクラスをスーパークラス(親クラス)、利用する方のクラスをサブクラス(子クラス)と呼びます。
サブクラスでスーパークラスの機能を引き継ぐことを継承といいます。
書式は

class サブクラス extends スーパークラス

となります。
ではどう動くか見てみましょう。
class Sample10{
	public static void main(String args[]){
		TelNo info;
		info = new TelNo();

		//スーパークラスのメソッドです
		info.setName("Java 花子");
		info.setAddress("千代田区神田佐久間町");
		//サブクラスのメソッドです
		info.setTel("03-3863-7794");
		
		info.disp();
		info.telDisp();
	}
}
			
サブクラスのインスタンスからスーパークラスのメソッドが呼び出されていますね。
サブクラスでは継承したスーパークラスのフィールド、メソッドをすべて扱うことができます。
とかく難しく語られがちなJavaの継承ですが、これだけのことです。
・実行結果
C:\kikuchi\JavaRensyu>java Sample10
名前:Java 花子
住所:千代田区神田佐久間町
電話:03-3863-7794

C:\kikuchi\JavaRensyu>
			
さらに登録年月日も一緒に扱いたくなったとしましょう。

▲ページの先頭へ戻る


TelNo extends Kaiin extends Regist
これは間違いです。Javaでは基本的にひとつのサブクラスが継承できるスーパークラスはひとつだけです。
複数のクラスを利用する方法は、第12回で説明します。

■メソッドのオーバーライド
会員管理プログラムを例にとって見てきましたが、急に個人情報保護法により普段は住所は表示しないように、と言われたらどうしましょう。
会員情報を表示する機能は同じでも、表示する内容は変えたい、そういう場合にもJavaは対応できる機能を持っています。
次のソースを見てください。
class TelNo extends Kaiin{
	private String tel;
	
	public void setTel(String tel){
		this.tel = tel;
		}
	public void telDisp(){
		System.out.println("電話:" + tel);
	}
	public void disp(){
		System.out.println("名前:" + getName());
	}
}
			
最後にdisp()メソッドが付け足されていますが、これは会員情報で定義したメソッドと同じ名前ですね。
これをSample10から実行すると次のように表示されます。
C:\kikuchi\JavaRensyu>java Sample10
名前:Java 花子
電話:03-3863-7794

C:\kikuchi\JavaRensyu>
			
サブクラスのdisp()メソッドが呼び出されているのが分かります。
このように、スーパークラスのメソッドをサブクラスで再定義することをメソッドのオーバーライド(override;覆す、優先する)といいます。
ここでは会員情報を表示するdisp()メソッドをオーバーライドしています。

・スーパークラスのメソッドを呼び出す
最後に、オーバーライドされたスーパークラスのメソッドの呼び出し方を紹介します。
	public void disp(){
//		System.out.println("名前:" + getName());
		super.disp();
	}
			
このようにサブクラス内でsuper.を付けてメソッドを呼び出すと、スーパークラスのメソッドを呼び出すことができます。
・実行結果
C:\kikuchi\JavaRensyu>java Sample10
名前:Java 花子
住所:千代田区神田佐久間町
電話:03-3863-7794

C:\kikuchi\JavaRensyu>
			
またsuper.はメソッドのほかにスーパークラスのフィールド(変数)も呼び出すことができます。

いかがでしたでしょうか。
継承とオーバーライドはじっくり読んで理解してください。