3秒でわかる
既存クラスの性質を引き継いで新しいクラスを作る仕組み。共通処理を親にまとめ、違う部分だけを子で上書きして書き分けられます。
もう少し詳しく
どういうものか
継承は、あるクラスのフィールドとメソッドを別のクラスが引き継ぐ仕組みです。引き継ぐ側を子クラス (サブクラス)、引き継がれる側を親クラス (スーパークラス) と呼びます。Java では extends を書いて表します。子クラスは親のメソッドをそのまま使えるほか、同じ名前で定義し直して振る舞いを差し替えられます。これがオーバーライドで、親の型の変数に子のインスタンスを入れても、実際に動くのは子の実装になります。
なぜ必要か
社員クラスと管理職クラスのように、8 割が同じで 2 割だけ違うものを別々に書くと、共通部分の修正が 2 か所に散らばります。継承を使えば共通部分は親に 1 つだけ置き、違う部分だけ子で上書きできます。
もうひとつの効き目は、呼び出す側を書き換えずに種類を増やせることです。親の型で受け取って処理を書いておけば、子クラスを新しく追加しても呼び出し側のコードには手を入れずに済みます。
具体例
class Employee {
protected String name;
Employee(String name) { this.name = name; }
int bonus() { return 100000; }
}
class Manager extends Employee {
Manager(String name) { super(name); }
@Override
int bonus() { return 300000; }
}
Employee e = new Manager("佐藤");
System.out.println(e.bonus()); // 300000 が出る変数の型は Employee なのに、実行されるのは Manager の bonus です。この呼び分けをポリモーフィズムと呼びます。
似た用語との違い
| 仕組み | 何を引き継ぐか | 多重に持てるか |
|---|---|---|
| 継承 (extends) | 実装とフィールド | 1 つだけ |
| インタフェース (implements) | 仕様。既定実装は default のみ | いくつでも |
| コンポジション | 引き継がず、部品として持つ | いくつでも |
近年は継承よりコンポジションが推奨される場面が増えています。親を変えると全部の子に影響が出るためで、is-a の関係 (管理職は社員である) が本当に成り立つときだけ継承を選びます。
つまずきやすいところ
子クラスのコンストラクタでは、親のコンストラクタが先に走ります。super() を明示しない場合は引数なしの親コンストラクタが呼ばれるため、親に引数なしのコンストラクタが無いとコンパイルが通りません。また、private のフィールドは継承しても子から直接触れません。子から使うなら protected にするか、親側にアクセサを用意します。