メソッドのオーバーライドとは
メソッドのオーバーライドとは、親クラスで定義されたメソッドと同じ名前かつ同じシグネチャ(引数の数と型)のメソッドを子クラスで定義することで、子クラスのインスタンスに対するメソッドの呼び出しで用いられる親クラスのメソッドの実装を上書きすることです。
オーバーロード(同じ名前で違うシグネチャのメソッドを同じクラスに定義し、引数によって使い分けさせること)と混同しないように注意が必要です。
実例
人間クラス
ここでは簡単のため、人間の情報は名前と誕生年だけであるとします。
普通の人間の年齢は、現在の年と誕生年の差で求まります。
(正確には誕生日の前後で違いますが、ここでは省略します)
Human.java
public class Human {
private String name;
private int birthYear;
/**
* 名前と誕生年をもとに人間のインスタンスを作成する。
* @param name 名前
* @param birthYear 誕生年
*/
public Human(String name, int birthYear) {
this.name = name;
this.birthYear = birthYear;
}
/**
* 名前を取得する。
* @return 名前
*/
public String getName() {
return name;
}
/**
* 年齢を取得する。
* @param currentYear 年齢を計算する年
* @return 年齢
*/
public int getAge(int currentYear) {
return currentYear - birthYear;
}
/**
* 自己紹介する。
* @param currentYear 年齢を計算する年
*/
public void introduce(int currentYear) {
System.out.println(getAge(currentYear) + "歳の" + getName() + "です。");
}
}
田村ゆかりクラス
田村ゆかりは人間なので、人間クラスを継承します。
田村ゆかりは17歳なので、人間クラスの年齢の計算方法を上書きします。
ちなみに、{@inheritDoc}
というおまじないを用いると、自分でコピペしなくても親クラスのオーバーライドされたメソッドの説明をjavadoc
側でコピペしてくれます。
TamuraYukari.java
public class TamuraYukari extends Human {
/**
* 田村ゆかりのインスタンスを作成する。
*/
public TamuraYukari() {
super("田村ゆかり", 1976);
}
/** {@inheritDoc} */
public int getAge(int currentYear) {
return 17;
}
}
テスト実行
適当なインスタンスを作成し、自己紹介させます。
クラス名が適当なのは気にしないでください。
Bekkii.java
public class Bekkii {
public static void main(String[] args) {
Human hanazawaKana = new Human("花澤香菜", 1989);
Human tamuraYukari = new TamuraYukari();
int year = 2016;
hanazawaKana.introduce(year);
tamuraYukari.introduce(year);
}
}
このプログラムを実行すると、以下の結果が得られました。
27歳の花澤香菜です。
17歳の田村ゆかりです。
同じHuman
型の変数に代入され、Human
クラスで定義されたメソッドを呼び出しても、その中で呼び出しているメソッドの実装が田村ゆかりのインスタンスでは上書きされていることがわかります。