継承の基本 (extends)
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 20/87。
継承は、オブジェクト指向プログラミング(OOP)の主要な柱の一つです。これにより、あるクラスが別のクラスのプロパティやメソッドを引き継ぐことが可能になり、コードの再利用を促進し、クラス間に自然な階層構造を確立します。
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) を保持する private フィールド - ブランド名を受け取るコンストラクタ(Vehicle は親クラスであるため、ここでは
super()は不要です) - ブランドを返す
getBrand()メソッド [brand] is startingと出力するstart()メソッド
- 車両の
Motorcycle.java: Vehicle を継承するサブクラスを作成します。オートバイは車両の一種(is-a 関係)であるため、継承を使用するのが適切です。Motorcycle クラスでは以下を行います:extendsを使用して Vehicle から継承する- ブランドを受け取り、
super(brand)を使用してそれを親クラスに渡すコンストラクタを作成する - 独自のメソッド
wheelie()を追加し、[brand] is doing a wheelie!と出力する
Main.java: Motorcycle オブジェクトを作成し、継承された動作と独自の動作の両方を実行して、すべてをまとめます。入力としてブランド名を1つ受け取ります。以下のメソッドを呼び出して2行出力してください:- 継承された
start()メソッド - Motorcycle 独自の
wheelie()メソッド
- 継承された
入力として、オートバイのブランド名 (String) を1つ受け取ります。
Motorcycle クラスが、start() や getBrand() を書き直すことなく自動的にアクセスできることに注目してください。これが継承の力です!
チートシート
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 myDog = new Dog("Buddy");
myDog.eat(); // 継承されたメソッド
myDog.bark(); // 独自のメソッドサブクラスのコンストラクタでsuper()を使用して、親クラスのコンストラクタを呼び出します。
継承は、クラス間の「is-a」関係を表します。
自分で試してみよう
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 クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造