応用第2日目:継承

継承を使ったクラス設計を学びます。extendsキーワード、親クラス・子クラスの関係、Objectクラスを確認します。

応用 1 2 3 4 5 6 7

応用第2日目:継承

継承

継承とは

Javaでは、あるクラスのメンバ(フィールドやメソッド)を別のクラスに引き継ぐことができます。この機能を継承と言います。継承によって、共通の機能を持つクラスをまとめて管理でき、コードの再利用性が高まります。

継承元のクラスを親クラス(スーパークラス)、継承したクラスを子クラス(サブクラス)と言います。子クラスは親クラスのメンバをそのまま使いながら、独自のフィールドやメソッドを追加することができます。(図2-1)

継承のイメージ

図2-1:継承のイメージ

継承の書き方
class 子クラス名 extends 親クラス名 {
  // 追加するフィールドやメソッド
}

サンプルプログラム

以下のサンプルでは、自動車クラス(Car)を継承した救急車クラス(Ambulance)を定義します。

Car.java
package exday2;

public class Car {
    private int fuel = 0;
    private int migration = 0;

    public Car() {
        System.out.println("Carオブジェクト生成");
    }

    public void move() {
        if(fuel >= 0) {
            migration++;
            fuel--;
        }
        System.out.println("移動距離 : "+migration);
        System.out.println("燃料 : "+fuel);
    }

    public void supply(int fuel) {
        if(fuel > 0) {
            this.fuel += fuel;
        }
        System.out.println("燃料 : "+fuel);
    }
}
Ambulance.java
package exday2;

public class Ambulance extends Car {
    private int number = 119;

    public Ambulance() {
        System.out.println("Ambulanceオブジェクト生成");
    }

    public void sevePeople() {
        System.out.println("救急救命活動");
        System.out.println("呼び出しは"+number+"番");
    }
}
SampleEx201.java
package exday2;

public class SampleEx201 {
    public static void main(String[] args) {
        Car c = new Car();
        c.supply(10);
        c.move();
        c.move();
        Ambulance a = new Ambulance();
        a.supply(10);
        a.move();
        a.sevePeople();
    }
}
Carオブジェクト生成
燃料 : 10
移動距離 : 1
燃料 : 9
移動距離 : 2
燃料 : 8
Carオブジェクト生成
Ambulanceオブジェクト生成
燃料 : 10
移動距離 : 1
燃料 : 9
救急救命活動
呼び出しは119番

AmbulanceクラスはCarクラスを継承しているため、Carクラスのsupply()move()メソッドをそのまま使用できます。また、Ambulanceのインスタンスを生成すると、親クラス(Car)のコンストラクタが先に実行され、次に子クラス(Ambulance)のコンストラクタが実行されます。(図2-2)

CarクラスとAmbulanceクラスの関係性

図2-2:CarクラスとAmbulanceクラスの関係性

単一継承と多重継承

Javaの継承の制限

Javaでは、1つの子クラスが継承できる親クラスは1つだけです。これを単一継承と言います。C++などの言語では複数の親クラスを持つ多重継承が可能ですが、Javaでは多重継承はサポートされていません。(図2-3)

単一継承と多重継承

図2-3:単一継承と多重継承

Objectクラス

すべてのクラスの親クラス

Javaでは、すべてのクラスが暗黙的にObjectクラスを継承しています。そのため、すべてのクラスはObjectクラスのメソッドを使用できます。主なObjectクラスのメソッドは以下のとおりです。

Objectクラスの主なメソッド
メソッド機能
toString()オブジェクトの文字表現を返します。デフォルトでは「クラス名@オブジェクト番号」の形式で返ります。
equals()同じ値を保持しているかどうかを判定します。オブジェクトの同一比較は==演算子で行います。
getClass()オブジェクトのクラス情報を返します。
SampleEx202.java
package exday2;

public class SampleEx202 {
    public static void main(String[] args) {
        Car c = new Car();
        System.out.println(c.toString());
        System.out.println(c.getClass());
        Object o = (Object)c;
        System.out.println(o.toString());
        System.out.println(o.getClass());
    }
}
Carオブジェクト生成
exday2.Car@1690726
class exday2.Car
exday2.Car@1690726
class exday2.Car

CarクラスはObjectクラスを継承しているため、toString()getClass()が使用できます。CarオブジェクトをObjectクラスの変数にキャストしても、オブジェクト自体は変わらないため同じ結果が得られます。なお、オブジェクト番号(@以降の数値)は実行環境によって異なります。

練習問題 応用2 へ →