本稿は Java の継承に関する記事です。継承とは、既存のクラス (親クラス・スーパークラス) が持つフィールド・メソッドを、新しいクラス (子クラス・サブクラス) でそのまま引き継いで利用する仕組みです。共通ロジックを 1 箇所にまとめ、差分だけ子クラスに書く設計を可能にします。
継承の構文
|
class 子クラス名 extends 親クラス名 { |
継承の具体例
|
// 親クラス |
継承で出来ること
| 仕組み | 概要 |
|---|---|
| フィールド・メソッドの継承 | 親クラスの protected / public なメンバを子側でそのまま使える |
| メソッドのオーバーライド | 同じシグネチャで挙動を上書きする (@Override を付ける) |
| 多態性 (ポリモーフィズム) | 親クラスの型変数で子インスタンスを扱える |
| 抽象クラス・抽象メソッド | 共通ロジック + 必須実装を子へ強制 |
| final で禁止 | クラスやメソッドの継承・オーバーライドを禁止 |
Java の継承ルール
- クラスの多重継承は不可 (extends は 1 つだけ)。複数の振る舞いを取り込みたい場合はインタフェースを
implementsする - すべてのクラスは暗黙的に
java.lang.Objectを継承 - コンストラクタは継承されない。子側で自分のコンストラクタを定義する
- 子のコンストラクタ先頭で親のコンストラクタが必ず呼ばれる (明示しなければ
super()) privateメンバは継承されるが、子からは直接アクセスできないstaticメンバも継承されるが、本質的にはクラス共有なのでオーバーライドの代わりに「隠蔽 (hiding)」になる- インタフェースは多重実装可。Java 8 以降は
defaultメソッドで実装も持てる
アクセス修飾子と継承可視性
| 修飾子 | 同一クラス | 同一パッケージ | 子クラス | 他 |
|---|---|---|---|---|
public | ○ | ○ | ○ | ○ |
protected | ○ | ○ | ○ | × |
| (無指定 / package-private) | ○ | ○ | × | × |
private | ○ | × | × | × |
オーバーライドのルール
- シグネチャ (メソッド名・引数の型と数) が親と一致すること
- 戻り値は親と同じか、共変な (より狭い) 型でも可
- アクセス修飾子は親と同等以上の公開度 (狭めるのは不可)
- チェック例外は親が宣言しているもの以下に限る
@Overrideアノテーションをつけてコンパイラチェックを利用
継承と合成 (Composition) の使い分け
| 判断軸 | 継承 | 合成 (フィールドとして保持) |
|---|---|---|
| 関係性 | 「〜は〜である (is-a)」 | 「〜は〜を持つ (has-a)」 |
| 結合度 | 強い | 弱い |
| 差分実装の柔軟性 | 制限される | 柔軟 |
| テスト容易性 | 親に依存して難しくなりがち | モック差し替えしやすい |
近年は「Composition over Inheritance」(継承より合成) の方針が主流です。継承は本当に is-a 関係がある場合のみ使い、ふるまいの差し替えはインタフェース+実装注入を活用します。
注意点
- final クラス / final メソッドは継承・オーバーライド禁止 (
Stringは final クラス) - 深い継承階層は理解しづらく壊れやすい。2〜3 階層に留めるのが目安
- サブクラスから親のprotected フィールドを書き換える設計は脆い。getter / setter 経由が安全
- equals / hashCode の継承はサブクラスで再定義が必要なケースが多い
- 差分プログラミング (Diff Programming) の手段としての継承の濫用は強い密結合を生み、変更コストを上げる
関連
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- MariaDB Monitor (mysql コマンド) の使い方 2026-10-14 15:21:02
- MariaDB の管理ツール (phpMyAdmin / DBeaver 等) 2026-10-14 15:21:02
- Google Custom Search JSON API|新規受付終了・移行期限と既存実装の確認 2026-10-14 14:50:13
- MySQL rootの初期パスワード確認|導入方式・Docker既存DB・復旧の注意 2026-10-14 14:39:34
- MySQL root パスワードの変更方法(ALTER USER / mysqladmin / パスワード忘れ時の復旧) 2026-10-14 14:39:34
- MySQL ALTER USER の使い方|パスワード変更・アカウントロック 2026-10-14 14:39:34
- MySQL ERROR 1129|ホスト遮断の原因・カウンタ・解除前の確認 2026-10-14 14:04:49
- MySQL ERROR 1820・1862|期限切れパスワードの安全な更新と確認 2026-10-14 14:04:49
- MySQL ERROR 1698|ソケット認証・OSユーザー・接続経路の確認 2026-10-14 14:04:49
- mysql_configが見つからない|mysqlclientの旧ビルドとpkg-configの確認 2026-10-14 13:36:32
- MySQLエラー一覧|番号・SQLSTATE別の原因と安全な確認手順 2026-10-14 13:36:32
- インストール直後にNetbeansが反応しない 2026-10-14 13:07:02
- NetBeans でよくあるエラー一覧と対処法 — JDK / Tomcat / PHP / メモリ不足 2026-10-14 13:07:02
- Apache NetBeans入門|起動JDK・プロジェクト作成・関連手順 2026-10-14 13:07:02
- 【Laravel】ページング(ページネーション)をする方法 2026-10-14 12:31:44