継承の基本 (extends)
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 20/87。
継承は、OOPの主要な柱の1つです。これにより、あるクラスが別のクラスのプロパティやメソッドを継承できるようになり、コードの再利用を促進し、クラス間に自然な階層構造を確立します。
Javaでは、extendsキーワードを使用して継承関係を作成します。継承する側のクラスはサブクラス(または子クラス)と呼ばれ、継承される側のクラスはスーパークラス(または親クラス)と呼ばれます。
public class Animal {
private String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating");
}
public String getName() {
return name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name); // 親クラスのコンストラクタを呼び出します
}
public void bark() {
System.out.println(getName() + " says woof!");
}
}Dogクラスは、Animalからeat()メソッドとgetName()メソッドを自動的に継承します。また、bark()のような独自のメソッドを定義することもできます。
Dog myDog = new Dog("Buddy");
myDog.eat(); // 継承: "Buddy is eating"
myDog.bark(); // 独自のメソッド: "Buddy says woof!"継承を「is-a」関係として考えてみましょう。Dog は Animal であるため、Dog が Animal を extend するのは理にかなっています。この関係により、共通の機能を共有しながら、独自の動作を追加した特化したクラスを構築できます。
チャレンジ
簡単継承の動作を実証するシンプルな車両システムを構築しましょう。共通の車両プロパティを保持する親クラスと、それを拡張して特殊な動作を追加する子クラスを作成します。
コードは3つのファイルに分けて構成します:
Vehicle.java: あらゆる車両を表す親クラスを作成します。以下の内容を含める必要があります:- 車両の
brand(String) 用のプライベートフィールド - ブランド名を受け取り、それをフィールドに代入するコンストラクタ。(Vehicleは階層の最上位であるため、ここでは
super()の呼び出しは不要です。) - ブランドを返す
getBrand()メソッド [brand] is startingと出力するstart()メソッド
- 車両の
Motorcycle.java: Vehicleを継承するサブクラスを作成します。オートバイは車両(is-a関係)であるため、継承を使用するのが適切です。Motorcycleは以下の内容を含める必要があります:extendsを使用して Vehicle から継承する- ブランドを受け取り、
super(brand)を使用してそれを親クラスに渡すコンストラクタ [brand] is doing a wheelie!と出力する独自のwheelie()メソッドを追加する
Main.java: Motorcycleオブジェクトを作成し、継承された動作と独自の動作の両方を実演して、すべてをまとめます。1つの入力(ブランド名)を受け取ります。以下のメソッドを呼び出して2行出力してください:- 継承された
start()メソッド - Motorcycle独自の
wheelie()メソッド
- 継承された
オートバイのブランド名 (String) として、1つの入力を受け取ります。
Motorcycleが start() や getBrand() を書き直すことなく、自動的にそれらにアクセスできることに注目してください。これが継承の力です!
自分で試してみよう
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String brand = scanner.nextLine();
// TODO: brandを使用してMotorcycleオブジェクトを作成する
// TODO: 継承されたstart()メソッドを呼び出す
// TODO: wheelie()メソッドを呼び出す
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造