メインコンテンツにスキップ
モジュール 3 · レッスン 1 / 2コース内の 5/14~12 min
モジュールのレッスン (1/2)

相続

継承は、クラス (子クラスまたはサブクラスと呼ばれる) が別のクラス (親クラスまたはスーパークラスと呼ばれる) からフィールドおよびメソッドを継承できるようにする OOP の基本メカニズムです。

これにより、コードの再利用が促進され、不必要な繰り返しが回避されます。

extends によるクラスの拡張

Java では、クラスが別のクラスから継承することを示すために extends キーワードを使用します。

Java
class Vehicle {
    protected int speed; // 'protected' makes the field visible to subclasses

    public void honk() {
        System.out.println("Beep beep!");
    }
}

class Car extends Vehicle {
    // Car automatically inherits the speed field and the honk() method
}

コンストラクターと super() キーワード

スーパークラスにパラメーターを受け入れるコンストラクターがある場合、サブクラスは、最初のステートメントとして super(...) を使用して、コンストラクター内でそれを明示的に呼び出す必要があります。

Java
class Person {
    String name;

    public Person(String name) {
        this.name = name;
    }
}

class Student extends Person {
    int studentId;

    public Student(String name, int studentId) {
        super(name); // Invokes the constructor of Person
        this.studentId = studentId;
    }
}

メソッドのオーバーライド (@Override)

サブクラスは、スーパークラスから継承されたメソッドに独自の特定の実装を提供できます。この操作は オーバーライド (メソッドのオーバーライド) と呼ばれ、@Override 注釈によって示されます。

Java
class Animal {
    public void makeSound() {
        System.out.println("Rumore generico");
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Miao!");
    }
}

protected 修飾子

protected アクセス修飾子は、継承において重要な役割を果たします。同じクラス内でのみメンバーを表示する private とは異なり、 protected では、フィールドとメソッドが異なるパッケージに存在する場合でも、同じパッケージ内およびすべてのサブクラスの両方からアクセスできます。

super を使用した親メンバーへのアクセス

スーパークラス コンストラクターの呼び出しに加えて、サブクラス メソッド内で super キーワードを使用して、親クラスのメソッドまたは変数を参照できます。これは、メソッドがオーバーライドされても元の親の動作を呼び出したい場合に特に便利です。

Java
class Animal {
    public void sleep() {
        System.out.println("Zzz");
    }
}

class Cat extends Animal {
    @Override
    public void sleep() {
        super.sleep(); // Executes the behavior of Animal
        System.out.println("The cat purrs while sleeping.");
    }
}

Java での単一継承

Java では、クラスは 1 つのクラスのみ (単一継承) を拡張できます。複数のクラスからの直接継承 (多重継承) は許可されません。たとえば、class Cat extends Animal, Mammal はコンパイル エラーを引き起こします。この設計上の選択により、(2 つのスーパークラスが異なる実装で同じメソッドを定義する場合の) 「ダイヤモンド問題」として知られるあいまいさが回避されます。この制限を克服するために、Java では インターフェイス の概念が導入されています。これについては、次のモジュールで説明します。


自分で試してみてください

運動#java.m3.l1.e1
試行回数: 0読み込み中…

Animal を拡張して Dog サブクラスを完成させます。名前 (文字列) を受け入れ、super(name) を使用してそれを Animal コンストラクターに渡す Dog コンストラクターを宣言します。

エディターを読み込み中…
ヒントを表示

`public Dog(文字列名) { super(name); と書きます。 Dog クラス内の }`。

3 回の試行後に解決策が利用可能になります

運動#java.m3.l1.e2
試行回数: 0読み込み中…

Animal から Dog を拡張し、Generic Sound の代わりに文字列 Wof を返すように makeSound() メソッドをオーバーライドします。 @Override アノテーションを使用します。

エディターを読み込み中…
ヒントを表示

宣言 `public String makeSound() { return 'Woof'; の上に `@Override` を記述します。 }` 犬の中。

3 回の試行後に解決策が利用可能になります

運動#java.m3.l1.e3
試行回数: 0読み込み中…

Animal を拡張し、makeSound() メソッドをオーバーライドして文字列 Meow を返す Cat クラスを宣言します。 Animal クラスには、名前を受け入れるコンストラクターがすでにあります。 Cat コンストラクターも名前を受け入れ、それをスーパークラス コンストラクターに正しく渡すようにしてください。

エディターを読み込み中…
ヒントを表示

「Animal」を拡張する「Cat」クラスを作成します。コンストラクター `public Cat(String name) { super(name); を宣言します。 }` を実行し、`@Override` を使用して `makeSound()` メソッドをオーバーライドして `'Meow'` を返します。

3 回の試行後に解決策が利用可能になります