応用第2日目:継承
継承
継承とは
Javaでは、あるクラスのメンバ(フィールドやメソッド)を別のクラスに引き継ぐことができます。この機能を継承と言います。継承によって、共通の機能を持つクラスをまとめて管理でき、コードの再利用性が高まります。
継承元のクラスを親クラス(スーパークラス)、継承したクラスを子クラス(サブクラス)と言います。子クラスは親クラスのメンバをそのまま使いながら、独自のフィールドやメソッドを追加することができます。(図2-1)
図2-1:継承のイメージ
// 追加するフィールドやメソッド
}
サンプルプログラム
以下のサンプルでは、自動車クラス(Car)を継承した救急車クラス(Ambulance)を定義します。
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);
}
}
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+"番");
}
}
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();
}
}
燃料 : 10
移動距離 : 1
燃料 : 9
移動距離 : 2
燃料 : 8
Carオブジェクト生成
Ambulanceオブジェクト生成
燃料 : 10
移動距離 : 1
燃料 : 9
救急救命活動
呼び出しは119番
AmbulanceクラスはCarクラスを継承しているため、Carクラスのsupply()やmove()メソッドをそのまま使用できます。また、Ambulanceのインスタンスを生成すると、親クラス(Car)のコンストラクタが先に実行され、次に子クラス(Ambulance)のコンストラクタが実行されます。(図2-2)
図2-2:CarクラスとAmbulanceクラスの関係性
単一継承と多重継承
Javaの継承の制限
Javaでは、1つの子クラスが継承できる親クラスは1つだけです。これを単一継承と言います。C++などの言語では複数の親クラスを持つ多重継承が可能ですが、Javaでは多重継承はサポートされていません。(図2-3)
図2-3:単一継承と多重継承
Objectクラス
すべてのクラスの親クラス
Javaでは、すべてのクラスが暗黙的にObjectクラスを継承しています。そのため、すべてのクラスはObjectクラスのメソッドを使用できます。主なObjectクラスのメソッドは以下のとおりです。
| メソッド | 機能 |
|---|---|
| toString() | オブジェクトの文字表現を返します。デフォルトでは「クラス名@オブジェクト番号」の形式で返ります。 |
| equals() | 同じ値を保持しているかどうかを判定します。オブジェクトの同一比較は==演算子で行います。 |
| getClass() | オブジェクトのクラス情報を返します。 |
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());
}
}
exday2.Car@1690726
class exday2.Car
exday2.Car@1690726
class exday2.Car
CarクラスはObjectクラスを継承しているため、toString()やgetClass()が使用できます。CarオブジェクトをObjectクラスの変数にキャストしても、オブジェクト自体は変わらないため同じ結果が得られます。なお、オブジェクト番号(@以降の数値)は実行環境によって異なります。