はじめに
前回の記事では、Javaの継承について紹介しました。
前回の記事
本記事では、Javaのオーバーライドについて紹介します。
オーバーライドとは
オーバーライドとは、継承元であるスーパークラス(親クラス)で定義されているメソッドを、サブクラス(子クラス)で書き換えることです。
スーパークラスにあるメソッドと、同じ名前、同じ引数のメソッドをサブクラスに記述することでオーバーライドすることができます。
以下の図は、オーバーライドの例です。
スーパークラスにある「cry」というメソッドを、サブクラスに定義することでスーパークラスの「cry」を上書きしています。
その結果「Cat」クラスの「cry」メソッドを呼び出すと、オーバーライドしたメソッドが呼び出されます。
スポンサーリンク
オーバーライドの使用例
それでは、実際にソースコードでオーバーライドの例を紹介します。
次の例では、スーパークラスのメソッド「cry」をサブクラスがオーバーライドしています。
[スーパークラス]
/**
* 動物クラス
*/
public class Animal {
private static final String ZOO_NAME = "○○動物園";
/**
* コンストラクタ
*/
public Animal() {
System.out.println(ZOO_NAME + "にようこそ");
}
/**
* 鳴き声
*/
public void cry() {
System.out.println("動物の鳴き声");
}
}
[サブクラス]
/**
* 猫クラス
*/
public class Cat extends Animal {
/**
* 鳴き声
*/
public void Cry() {
System.out.println("猫の鳴き声はみゃー");
}
}
次の「MainSample」クラスでは、サブクラスである「Cat」クラスのオブジェクトを生成し「cry」メソッドを実行しています。
[プログラムの実行]
public class MainSample {
public static void main(String[] args) {
Cat cat = new Cat();
cat.cry();
}
}
[実行結果]
○○動物園にようこそ
猫の鳴き声はみゃー
実行した結果、スーパークラスのコンストラクタ、そして オーバーライドしたサブクラスの「cry」メソッドの内容が実行されました。
Overrideアノテーションの必要性
Overrideアノテーションは、Java1.5で追加されたアノテーションです。Overrideアノテーション記述することで、スーパークラスのメソッドをオーバーライドしていることを明示します。
Overrideアノテーションをつけなくてもオーバーライドは可能です。では、なぜOverrideアノテーションが必要なのでしょうか。
例えば、次のようなスーパークラスとサブクラスがあるとします。
[スーパークラス]
/**
* 動物クラス
*/
public class Animal {
/**
* 鳴き声
*/
public void cry() {
System.out.println("動物の鳴き声");
}
}
[サブクラス]
/**
* 犬クラス
*/
public class Dog extends Animal {
/**
* 鳴き声
*/
public void cri() {
System.out.println("犬の鳴き声はワン");
}
}
スーパークラスの「cry」メソッドをオーバーライドしているつもりが、よく見るとスペルミスをしています。
このようにOverrideアノテーションをつけないでオーバーライドした場合は、コンパイルエラーにならないので、ミスに気付きにくいです。
スポンサーリンク
では、Overrideアノテーションをつけた場合、どのような動作になるか見ていきます。
Overrideアノテーションをつけると、次の例のようにオーバーライドの使い方が間違っている場合、コンパイルエラーが発生します。
Overrideアノテーションをつけることで、オーバーライドしたつもりが出来ていなかったという凡ミスに気づくことができます。
ポイント
オーバーライドするときは、忘れずにOverrideアノテーションをつけることが大切。
スーパークラスのメソッドを呼び出す(super)
サブクラスの中で「super」を使うと、サブクラスでオーバーライドしていてもスーパークラスのメソッドを呼び出すことができます。
次の例では、スーパークラスのメソッド「cry」をサブクラスがオーバーライドしています。そして、サブクラスの中で「super.cry()」とスーパークラスのメソッドを呼び出しています。
[スーパークラス]
/**
* 動物クラス
*/
public class Animal {
private String ZOO_NAME = "○○動物園";
/**
* コンストラクタ
*/
public Animal() {
System.out.println(ZOO_NAME + "にようこそ");
}
/**
* 鳴き声
*/
public void cry() {
System.out.println("動物の鳴き声");
}
}
[サブクラス]
public class Pig extends Animal {
/**
* 鳴き声
*/
@Override
public void cry() {
super.cry();
System.out.println("豚の鳴き声はブー");
}
}
それでは、プログラムを実行してみます。
[プログラムの実行]
public class MainSample2 {
public static void main(String[] args) {
Pig pig = new Pig();
pig.cry();
}
}
[実行結果]
○○動物園にようこそ
動物の鳴き声
豚の鳴き声はブー
実行した結果、スーパークラスのコンストラクタ、そして オーバーライドしたサブクラスの「cry」メソッドの内容が実行されました。
サブクラスの「cry」メソッドの中で「super.cry()」とスーパークラスの「cry」メソッドを呼び出しているので、スーパークラスの「cry」メソッドの内容も実行されています。
終わりに
本記事では、Javaのオーバーライドについて紹介しました。
次回の記事では、Javaの抽象クラス(abstract)について紹介します。