いまから始めるアルゴリズム

新人編集者のJava学習物語 初級編

第5回 extendsで恋も授業も延長だ!

荒井亜子
2008/3/6

オーバーライド

先生 ソースコード1を見てみましょう。スーパークラスとサブクラスが定義されています

class Tori {
	public void eggPon() { // スーパークラスのeggPon ()メソッド
		System.out.println("ピーピー");
	}
}

class Hiyoko extends Tori {
	public void eggPon () { // サブクラスのeggPon ()メソッド
		System.out.println("ぴよぴよ");
	}
}

class OverrideSample {
	public static void main(String[] args) {
		Hiyoko hina = new Hiyoko();
		hina. eggPon (); //  eggPon ()メソッドを呼び出す
	}
}

ソースコード1

新人 ねぇねぇ、先生。ソースコード1はスーパークラスとサブクラスで同じメソッドがあるけど、どちらのメソッドが呼び出されるの?

先生 どちらだと思いますか? 実行してみましょう

C:\sinjinjava>javac OverrideSample.java
C:\sinjinjava>java OverrideSample
ぴよぴよ
C:\sinjinjava>

ソースコード1の実行結果

新人 あ、実行結果が「ぴよぴよ」ということは、サブクラスのメソッドが出た

先生 そうです。これは、オーバーライドといって、サブクラスの中でスーパークラスで定義しているメソッドと同じ名前でメソッドを再定義しているということなんです

K崎 つまりね、オーバーライドを利用することで、サブクラスのメソッドを優先して使用することができるんだよ

新人 K崎さん、いつの間に(笑)

K崎 まったく、つまずき通しで見ていられないよ

新人 ははは

先生 オーバーライドには条件があります。メソッド名、戻り値の型、引数の型がスーパークラスのメソッドと同じでなければなりません。注意してくださいね

新人 うぃ

thisとsuper

新人 メソッド名、引数の数、型が同じでも、スーパークラスのメソッドを呼び出す方法はないの?

先生 オーバーライドでは、メソッド名、引数の数、型が同じ場合は、サブクラスで定義したメソッドが呼び出されるというものでしたが、スーパークラスのメソッドを呼び出す方法もあります(ソースコード2)

class Tori {
	public void eggPon () {
		System.out.println("ピーピー");
	}
}

class Hiyoko extends Tori {
	public void eggPon () {
	
		// スーパークラスのメソッドを呼び出す
		super. eggPon (); 

		System.out.println("ぴよぴよ");
	}
}

class OverrideSample {
	public static void main(String[] args) {
		Hiyoko hina = new Hiyoko();
		hina. eggPon ();
	}
}

ソースコード2 スーパークラスのメソッドを呼び出す

新人 「super.eggPon()」っていうところ?

先生 そうです。また、superは、スーパークラスとサブクラスに同じ変数名があるとき、変数にsuperを付けてスーパークラスの変数にアクセスすることもできます

新人 あと、ローカル変数とインスタンス変数も同じ名前のときはどうやって区別するの?

先生 そういうときは、thisキーワードを使いましょう

class Tori {
	int x; // インスタンス変数x
	public void eggPon (int x) { // ローカル変数x

		// 左辺のxがインスタンス変数、右辺のxがローカル変数
		this.x = x; 
	}
}

ソースコード3 

新人 変数名はthisを付けるとインスタンス変数で、付けないとローカル変数なんだね

final

新人 オーバーライドさせたくないときは?

先生 スーパークラスのメソッドの前にfinalを付けます

class Tori {
	public final void eggPon () { // finalをメソッドの前に
		:
	}
}

class Hiyoko extends Tori {

	/* public void eggPon () { サブクラスでeggPon ()メソッドを
定義できない
	  	:
	  } */
}

ソースコード4 

新人 今日の授業ももうおしまいにしよー。おなかすいた

K崎 まったくこの子は。先生、授業をextendsで延長しちゃってください

新人 いやだ、K崎さんったら!

 Javaプログラミングの授業を通じ、K崎さんとも少しずつ距離が近くなっていく新人編集者。K崎さんに影響されて少しは勉強にも熱が入るといいのだが(次回、最終回)。

今回お世話になった富士通ラーニングメディアの講師、高木亮一先生より、プログラミング入門者へのアドバイス

継承やオーバーライドでつまずかないために

 これまでスムーズにJavaを学習してきた方でも、継承やオーバーライドの部分でつまずいてしまう方をよく見掛けます。継承は既存のコードを修正することなくクラスを拡張できます。

 また、継承と併せて学習する内容である、オーバーライド、インターフェイス、ポリモフィズムを自在に操ることで、オブジェクト指向の威力を存分に発揮することができます。

 まずは、講習会のテキストやお手持ちの参考書の例題プログラムをしっかりと理解するところから始めてください。その次のステップとして、オブジェクト指向を意識したプログラムを作成できるように頑張っていきましょう。



今回のインデックス
 継承の概念をマスターしよう (1ページ)
 オーバーライドに挑戦! (2ページ)

@IT自分戦略研究所の関連記事
では、Javaをどうやって覚える?
オブジェクト指向、本当に分かってる?
Javaの世界、イメージできる?
なぜJavaを学ぶのか
Javaをモノから学ぶ

@IT自分戦略研究所の関連サービス
ITトレメ(Sun Certified Programmer for the Java 2 Platform)

自分戦略研究所、フォーラム化のお知らせ

@IT自分戦略研究所は2014年2月、@ITのフォーラムになりました。

現在ご覧いただいている記事は、既掲載記事をアーカイブ化したものです。新着記事は、 新しくなったトップページよりご覧ください。

これからも、@IT自分戦略研究所をよろしくお願いいたします。