Menu
Coddy logo textTech

単一継承と多段階継承

CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 25/87。

これまで、1つの親クラスを直接継承するクラスを見てきました。しかし、継承はクラス同士の関連性に応じて、さまざまな構造を形成することがあります。2つの主要なパターン、単一継承多段階継承について見ていきましょう。

単一継承は、これまで私たちが使ってきたものです。クラスは、正確に1つの親クラスを直接継承します:

public class Animal { }
public class Dog extends Animal { }
public class Cat extends Animal { }

ここでは、DogCatの両方が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");
    }
}

この継承チェーンでは、DogMammalを継承し、MammalAnimalを継承しています。Dogオブジェクトは、チェーン全体のすべてのメソッドにアクセスできます。

Dog dog = new Dog();
dog.eat();      // Animalから
dog.breathe();  // Mammalから
dog.bark();     // Dogから

Objectがすべてのチェーンの最上位にあることを忘れないでください。したがって、私たちのDogには実際には4つのレベルがあります:Object -> Animal -> Mammal -> Dog。新しいオブジェクトを作成するとき、コンストラクタチェーンはこれらすべてのレベルを流れます。

challenge icon

チャレンジ

簡単

単一継承と多段階継承の両方のパターンを示す、交通手段の階層構造を構築しましょう。各レベルで新しい機能が追加されるクラスの連鎖を作成し、メソッドが複数のレベルを通じてどのように継承されるかを確認します。

コードは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 { }

DogCatはどちらも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 自体で定義
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン