extends / super / @Override
| 対応: | Java 1.0(1996) |
|---|
クラスの継承とメソッドのオーバーライドに関するキーワードです。『extends』で親クラスを継承し、『super』で親クラスのメンバーにアクセスします。『@Override』アノテーションでオーバーライドを明示します。
構文
// 親クラスを継承してサブクラスを定義します。
class SubClass extends SuperClass {
// 親クラスのフィールド・メソッドを引き継ぎます。
}
// 親クラスのコンストラクタを呼び出します(コンストラクタの先頭行)。
super(引数);
// 親クラスのメソッドを呼び出します。
super.メソッド名(引数);
// 親クラスのメソッドをオーバーライドします。
@Override
戻り値型 メソッド名(引数) {
// サブクラス独自の処理
}
キーワード・構文一覧
| キーワード | 概要 |
|---|---|
| extends | 親クラス(スーパークラス)を継承してサブクラスを定義します。Javaは単一継承のため、extends できるクラスは1つのみです。 |
| super(引数) | 親クラスのコンストラクタを呼び出します。サブクラスのコンストラクタの先頭行に書きます。 |
| super.メソッド名() | 親クラスのメソッドを明示的に呼び出します。オーバーライドしたメソッド内から親の処理を再利用できます。 |
| @Override | このメソッドが親クラスのメソッドをオーバーライドしていることをコンパイラに伝えます。スペルミスや誤ったシグネチャをコンパイル時に検出できます。 |
サンプルコード
sample_ExtendsOverride.java
class Fighter {
String name;
Fighter(String name) {
this.name = name;
}
String powerUp() {
return name + "が気をためている。";
}
}
class Saiyan extends Fighter {
Saiyan(String name) {
super(name);
}
@Override
String powerUp() {
return name + "が超サイヤ人に変身!";
}
String powerUpTwice() {
return super.powerUp() + " / " + this.powerUp();
}
}
class ExtendsOverride {
public static void main(String[] args) {
Fighter f = new Fighter("クリリン");
Saiyan s = new Saiyan("孫悟空");
System.out.println(f.powerUp()); // 『クリリンが気をためている。』と出力されます。
System.out.println(s.powerUp()); // 『孫悟空が超サイヤ人に変身!』と出力されます。
System.out.println(s.powerUpTwice()); // 『孫悟空が気をためている。 / 孫悟空が超サイヤ人に変身!』と出力されます。
// ポリモーフィズム:親クラス型の変数にサブクラスのインスタンスを代入できます。
Fighter f2 = new Saiyan("ベジータ");
System.out.println(f2.powerUp()); // 『ベジータが超サイヤ人に変身!』と出力されます。
}
}
javac ExtendsOverride.java java ExtendsOverride クリリンが気をためている。 孫悟空が超サイヤ人に変身! 孫悟空が気をためている。 / 孫悟空が超サイヤ人に変身! ベジータが超サイヤ人に変身!
概要
継承を使うことでコードの再利用が容易になります。サブクラスは親クラスの public / protected メンバーをそのまま使うことができ、必要に応じてオーバーライドして振る舞いを変更できます。
『@Override』アノテーションは省略可能ですが、付けておくとメソッド名のスペルミスや引数の型違いをコンパイル時に検出できるため、必ず付ける習慣をつけてください。すべてのクラスは暗黙的に Object クラスを継承しており、toString() や equals() なども Object のメソッドです。
インターフェースと抽象クラスについては『interface / implements / abstract』を、アクセス修飾子については『public / private / protected / static / final』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。