Java継承のマスター:概念、種類、実践例
Java継承をマスターする
Java継承を深く探求——その原則、実例、クリーンで再利用可能なコードへの適用方法を理解します。
継承は、既存のクラスに基づいて新しいクラスを作成できる、オブジェクト指向プログラミングの基石です。
派生クラスはサブクラス(子クラス、派生クラス)と呼ばれ、継承元のクラスはスーパークラス(親クラス、基底クラス)と呼ばれます。extendsキーワードでこの関係を確立します。
class Animal { // メソッドとフィールド } class Dog extends Animal { // DogはAnimalのフィールドとメソッドを継承 }
ここでは、DogがAnimalのすべてのメンバを継承し、サブクラスが親の機能を獲得します。
例1:基本的な継承
class Animal { String name; public void eat() { System.out.println("I can eat"); } } class Dog extends Animal { public void display() { System.out.println("My name is " + name); } } class Main { public static void main(String[] args) { Dog labrador = new Dog(); labrador.name = "Rohu"; labrador.display(); labrador.eat(); } }
出力
My name is Rohu I can eat
この例では、DogがAnimalからnameとeat()を継承しているため、Dogオブジェクトがそれらに直接アクセスできます。

is-a関係
Javaの継承はis-a関係を表します:サブクラスはスーパークラスの特殊な形です。
- Car is a Vehicle
- Orange is a Fruit
- Surgeon is a Doctor
- Dog is an Animal
これらの自然な階層が継承の使用を正当化します。
メソッドのオーバーライド
サブクラスがスーパークラスと同じシグネチャのメソッドを定義すると、サブクラスのメソッドがスーパークラスのバージョンをオーバーライドします。これにより実行時多態性が可能になります。
例2:eat()のオーバーライド
class Animal { public void eat() { System.out.println("I can eat"); } } class Dog extends Animal { @Override public void eat() { System.out.println("I eat dog food"); } public void bark() { System.out.println("I can bark"); } } class Main { public static void main(String[] args) { Dog labrador = new Dog(); labrador.eat(); labrador.bark(); } }
出力
I eat dog food I can bark
labradorでのeat()呼び出しは、Dogのオーバーライドされたメソッドに解決されます。
ヒント: @Overrideアノテーションは任意ですが強く推奨されます——メソッドを確かにオーバーライドしていることをコンパイラがチェックします。
superを使ったスーパークラスへのアクセス
オーバーライド時、superキーワードで親の実装を呼び出せます。
例3:eat()でのsuperの使用
class Animal { public void eat() { System.out.println("I can eat"); } } class Dog extends Animal { @Override public void eat() { super.eat(); System.out.println("I eat dog food"); } public void bark() { System.out.println("I can bark"); } } class Main { public static void main(String[] args) { Dog labrador = new Dog(); labrador.eat(); labrador.bark(); } }
出力
I can eat I eat dog food I can bark
ここでは、super.eat()がAnimalで定義されたメソッドを呼び出し、その後サブクラスのロジックを実行します。
同様に、superでスーパークラスのコンストラクタを呼び出せます。
継承におけるProtectedメンバ
protectedでマークされたフィールドやメソッドは、パッケージに関係なくサブクラスからアクセス可能です。
例4:Protectedメンバへのアクセス
class Animal { protected String name; protected void display() { System.out.println("I am an animal."); } } class Dog extends Animal { public void getInfo() { System.out.println("My name is " + name); } } class Main { public static void main(String[] args) { Dog labrador = new Dog(); labrador.name = "Rocky"; labrador.display(); labrador.getInfo(); } }
出力
I am an animal. My name is Rocky
サブクラスは、protectedフィールドnameを自由に読み書きし、display()を呼び出せます。
なぜ継承を使うのか?
- コードの再利用:子クラスは親のpublicおよびprotectedメンバを自動的に継承します。
- 多態性:オーバーライドにより動的メソッドディスパッチが可能になり、実行時多態性の重要な機能となります。
継承の種類
Javaは5つの概念的な継承モデルをサポートします——それぞれ異なるシナリオで有用です。
1. 単一継承
クラスが1つのスーパークラスのみを継承します。

2. 多重継承(マルチレベル)
サブクラスが別のクラスのスーパークラスとなり、連鎖を作ります。

3. 階層的継承
複数のサブクラスが1つのスーパークラスから継承します。

4. 多重継承(複数の親)
Javaではクラスが複数のクラスを継承することはできませんが、インターフェースでこのパターンを実現できます。

注意: 多重継承はインターフェースで実装可能です。Java implements multiple inheritanceを参照してください。
5. ハイブリッド継承
2つ以上の継承タイプの組み合わせ——例えば、階層的継承と多重継承の組み合わせ。

Java
- C# 継承をマスターする:概念、種類、実践コード
- C#の継承:再利用可能で保守しやすいコードを構築する
- Javaのfinalキーワード完全解説:変数、メソッド、クラスでの活用法
- Java instanceof演算子完全ガイド:基本から継承・インターフェースまで
- Java Staticネストクラスの理解:用法、違い、実例
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Javaリフレクション完全ガイド:実行時のクラス・メソッド・フィールド検査
- Java ObjectOutputStream完全ガイド:シリアル化、メソッド、実践例
- Javaジェネリクス完全ガイド:再利用可能で型安全なコードの構築
- Javaファイル操作のマスター:java.ioによる作成・読み取り・書き込み・削除