単一継承と多段階継承
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 25/87。
これまで、1つの親クラスを直接継承するクラスを見てきました。しかし、継承はクラス同士の関連性に応じて、さまざまな構造を形成することがあります。2つの主要なパターン、単一継承と多段階継承について見ていきましょう。
単一継承は、これまで私たちが使ってきたものです。クラスは、正確に1つの親クラスを直接継承します:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }ここでは、DogとCatの両方がAnimalから継承していますが、お互いからは継承していません。各子クラスは1つの直接の親を持ちます。
多段階継承は、あるクラスが別のクラスを継承し、そのクラスがさらに別のクラスを継承するという連鎖を作成します:
public class Animal {
public void eat() {
System.out.println("Eating");
}
}
public class Mammal extends Animal {
public void breathe() {
System.out.println("Breathing");
}
}
public class Dog extends Mammal {
public void bark() {
System.out.println("Barking");
}
}この継承チェーンでは、DogはMammalを継承し、MammalはAnimalを継承しています。Dogオブジェクトは、チェーン全体のすべてのメソッドにアクセスできます。
Dog dog = new Dog();
dog.eat(); // Animalから
dog.breathe(); // Mammalから
dog.bark(); // DogからObjectがすべてのチェーンの最上位にあることを忘れないでください。したがって、私たちのDogには実際には4つのレベルがあります:Object -> Animal -> Mammal -> Dog。新しいオブジェクトを作成するとき、コンストラクタチェーンはこれらすべてのレベルを流れます。
チャレンジ
簡単単一継承と多段階継承の両方のパターンを示す、交通手段の階層構造を構築しましょう。各レベルで新しい機能が追加されるクラスの連鎖を作成し、メソッドが複数のレベルを通じてどのように継承されるかを確認します。
コードは4つのファイルに分けて構成します:
Vehicle.java: 階層の最上位にあるベースクラスを作成します。すべての乗り物は以下を持つ必要があります:brand(String) のプライベートフィールド- ブランドを受け取るコンストラクタ
- ブランドを返す
getBrand()メソッド [brand] is movingと出力するmove()メソッド
LandVehicle.java: Vehicle を継承するクラスを作成します。これは多段階チェーンの中間レベルを表します。陸上車両は地上特有の動作を追加します:wheels(int) のプライベートフィールド- ブランドとホイール数を受け取り、親クラスの部分に
super(brand)を使用するコンストラクタ - ホイール数を返す
getWheels()メソッド [brand] honks!と出力するhonk()メソッド
Car.java: LandVehicle を継承するクラスを作成し、3レベルの継承チェーンを完成させます。Car は独自の専門的な機能を追加します:model(String) のプライベートフィールド- ブランド、ホイール数、モデルを受け取り、
super(brand, wheels)を使用するコンストラクタ - モデルを返す
getModel()メソッド [brand] [model] with [wheels] wheelsと出力するdisplayInfo()メソッド
Main.java: Car オブジェクトが階層の3つのレベルすべてからメソッドにアクセスできることを示します。ブランド (String)、ホイール数 (int)、モデル (String) の3つの入力を受け取ります。Car を作成し、以下のメソッドを順番に呼び出してください:move()- Vehicle (祖父クラス) から継承honk()- LandVehicle (親クラス) から継承displayInfo()- Car 自体で定義
ブランド名、ホイール数、モデル名の3つの入力を受け取ります。
出力には、Car オブジェクトが最上位の Vehicle から自身のクラスに至るまで、継承チェーンのすべてのレベルのメソッドをどのように使用できるかを示す3行が表示されるはずです。
チートシート
Javaはさまざまな継承構造をサポートしています。主な2つのパターンは、単一継承と多段階継承です。
単一継承は、クラスがちょうど1つの親クラスを直接拡張する場合に発生します:
public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }DogとCatはどちらもAnimalから継承していますが、お互いからは継承していません。
多段階継承は、あるクラスが別のクラスを拡張し、そのクラス自体がさらに別のクラスを拡張するという連鎖を作成します:
public class Animal {
public void eat() {
System.out.println("Eating");
}
}
public class Mammal extends Animal {
public void breathe() {
System.out.println("Breathing");
}
}
public class Dog extends Mammal {
public void bark() {
System.out.println("Barking");
}
}多段階継承では、子クラスは継承チェーン全体のすべてのメソッドにアクセスできます:
Dog dog = new Dog();
dog.eat(); // Animalから
dog.breathe(); // Mammalから
dog.bark(); // Dogからすべてのクラス階層の最上位にはObjectがあります。新しいオブジェクトを作成するとき、コンストラクタ・チェイニングはすべてのレベルを流れます。
自分で試してみよう
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 入力を読み込む
String brand = scanner.nextLine();
int wheels = scanner.nextInt();
scanner.nextLine(); // 改行文字を消費する
String model = scanner.nextLine();
// TODO: 入力値を使用して Car オブジェクトを作成する
// TODO: move() を呼び出す - Vehicle (祖父母クラス) から継承
// TODO: honk() を呼び出す - LandVehicle (親クラス) から継承
// TODO: displayInfo() を呼び出す - Car 自体で定義
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造