OOPの原則 継承
メニューを表示するにはスワイプしてください
継承
OOPの原則の一つである継承について説明。
継承は、あるクラスを基に新しいクラスを作成する仕組み。
- 基となるクラスは親クラスまたはスーパークラスと呼ばれる;
- 親クラスを基に作成されたクラスは子クラス、サブクラス、または派生クラスと呼ばれる。
このように、子クラスは他のクラス(親クラス)の特徴やプロパティ(メソッドや変数)を継承できる。
クラスの継承には extends キーワードを使用。親クラスから子クラスが継承する構文は次の通り:
Child.java
123class Child extends Parent { // properties and methods }
継承がコードでどのように機能するか、例を見てみる。クラス Bird には特定のフィールドとメソッドがあり、クラス Parrot には独自のフィールドとメソッドがある。オウムは鳥であるため、論理的にオウムは Bird クラスを継承するべきである:
こちらは、スクリーンショットのコードを、より読みやすく明確に書き直したものです。
Bird.java
Parrot.java
Main.java
12345678910111213141516171819package animals.birds; public class Bird { public String color; public boolean canFly; public int maxAge; public void eat() { System.out.println("The bird is eating"); } public void fly() { if (canFly) { System.out.println("The bird is flying!"); } else { System.out.println("This bird can't fly :("); } } }
これらの図で何が起こっているのかを理解しましょう。
- クラス
Birdを作成します。これは親クラスです。このクラスには独自のフィールドとメソッドがあります。 - クラス
Parrotを作成します。このクラスはextendsキーワードを使って親クラスBirdから継承します。Parrotクラスは子クラスであり、独自のフィールドとメソッドを持ちます。さらに、子クラスとしてParrotは親クラスBirdのすべてのフィールドとメソッドを継承します。 Parrotメソッド内でmainクラスのオブジェクトを作成し、親クラスと子クラスの両方のフィールドを初期化できることを確認します。まず親クラスBirdのフィールドを初期化し、次に子クラスParrotのフィールドを初期化します。次に、メソッドを呼び出します。最初に親クラスのメソッド、次に子クラスのメソッドを呼び出します。
このようにして、継承を利用して Bird クラスを継承しました。
なぜこれを行うのか?
多くの異なる Bird のサブクラス(例えば Parrot だけでなく、Pigeon や Penguin など)がある場合、boolean canFly のような重複したフィールドが多数発生します。継承の第一の利点は、重複したコードの断片を避けることです。
さらに、可読性が大幅に向上します。実際には、Bird クラスやそのサブクラスを直接扱うことはあまりありませんが、継承は特にインターフェースと組み合わせてよく使われます。
Note
インターフェースについては、このコースの次のセクションで学習します。
継承のルール
-
1つのクラスのみを継承可能。 Javaは多重継承をサポートしていません。1つのクラスは1つの親クラスしか持てません。
-
private変数とメソッド以外はすべて継承されます。
Note
自分自身から継承することはできません!
前述の通り、サブクラスは親クラスのすべての変数とメソッドにアクセスできると述べましたが、これは完全には正しくありません。
実際には、private 修飾子が付いたすべてのメソッドと変数はサブクラスからアクセスできません。
- 親クラスのメソッドのオーバーライド。
クラスを継承した際、継承したコードの一部を変更したい場合があります。特定のメソッドを親クラスとは異なる動作にしたい場合です。
親クラスのメソッドをオーバーライドするには、その上に @Override を記述します。
Parrot.java
1234@Override public void eat() { System.out.println("The parrot is eating"); }
上記のコードでは、親クラスのメソッドを__オーバーライド__しています。そのため、このメソッドが子クラスから呼び出されると、オーバーライドされたメソッドが実行されます。
- 継承の防止
クラスを他のクラスに継承させたくない場合は、final修飾子をクラスの前に付けます。
例えば:
Bird.java
Parrot.java
123public final class Bird { // fields and methods }
このように、キーワード final を使用することで、Bird クラスの継承を禁止しています。
これらは継承の基本的なルールおよび特徴です。継承は非常に広範なトピックであり、頻繁に利用されます。本コースを通じて、継承の他の側面にも慣れ、より多く活用できるようになります。
1. なぜJavaで継承が必要なのですか?
2. 一度に継承できるクラスはいくつですか?
3. Javaで継承を防ぐにはどうすればよいですか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください