クラスの継承

Revised: Dec./30th/2001: Since: Dec./30th/2001

ここでは、一つのクラスから別のクラスを作ってみます。例えば、「テレビ」クラスがあったとして、これに「録画」、「再生」メソッドを追加した「テレビデオ」クラスを作ろうということです。

継承

継承とはなにか

継承 (extends) とは、あるクラスの実装を土台にして、別のクラスを実装するための方法です。元になるクラスをスーパークラスと呼び、それを継承する新しいクラスをサブクラス(継承クラス)と呼びます。

一つのクラスは、任意の個数のサブクラスを持つことが出来ますが、逆に、スーパークラスは一つしか持てません。これを単一継承と呼び、クラスは継承されることで枝葉を広げていく木構造を成しています。そして、遡っていけば根っ子となる一つのスーパークラス(ルート・クラス)に行きつきます。

クラスの木構造の頂点、ルートとなるクラスが Object クラスです。これは java.lang パッケージに含まれ、スーパークラスを明示しないクラスの場合、自動的にこのクラスから派生されたことになります。スーパークラスを明示した場合でも、そのクラスも Object クラスのサブクラスか、または Object クラスを継承したクラスのサブクラスのいずれかなので、最終的にはあらゆるクラスが Object クラスをスーパークラスに持つことに変わりはありません。

サブクラスの性質

サブクラスは、「スーパークラスみたいなもの」、「スーパークラスの一種」だと言えます。「乗り物」が継承されて「自動車」が作られ、「自動車」を継承して「トラック」を作るようなもので、「トラック」は「自動車」の一種であり、更に「乗り物」の一種です。

また、サブクラスは、自身で実装したメソッドや変数に加えて、スーパークラスのメソッドや変数を全て継承して使えます。「トラック」は「自動車」の性質に独自の性質を加えたものであり、「自動車」は「乗り物」に独自の性質を加えたものです。

サブクラスは、スーパークラスの亜種/変種であり、スーパークラスの性質を全て備えています。

スーパークラスのメソッド呼び出し

スーパークラスのメソッド呼び出しを例に考えると、JavaVM は実行時に、次のように継承関係の木構造を遡って、該当するメソッドを探します:

  1. 自分が直接インスタンス化されたクラスから探して、
  2. なければ一つ上のスーパークラスを探して、
  3. なければ更に一つ上のスーパークラスを探して、
  4. 「3」を繰り返し、
  5. 最後にルートクラスである Object クラスのメソッドを探して、
  6. それでも見付からなければシンタックス・エラーを出します。

最初に見つかったメソッドに制御が移り、終了すれば呼び出し元に制御が戻ります。

基本書式

既存のクラスから派生したクラスを作成したい場合、クラス定義時に extends キーワードを記述します。

class クラス名 extends スーパークラス {
	内容
}

サンプル

次の例は、 Oya クラスを Ko1 クラスと Ko2 クラスで継承しています。

InheritDemo.java:

class InheritDemo {
	public static void main(String[] args) {
		// インスタンス化
		Ko1 ko1Obj=new Ko1();
		Ko2 ko2Obj=new Ko2();
		System.out.println("----Call Ko1----");
		ko1Obj.ko1Msg();
		// スーパークラスのメソッド呼び出し
		ko1Obj.oyaMsg();
		System.out.println("----Call Ko2----");
		ko2Obj.ko2Msg();
		// スーパークラスのメソッド呼び出し
		ko2Obj.oyaMsg();
	}
}
class Oya {
	void oyaMsg() {
		System.out.println("親のメソッド");
	}
}
class Ko1 extends Oya {
	void ko1Msg() {
		System.out.println("子1のメソッド");
	}
}
class Ko2 extends Oya {
	void ko2Msg() {
		System.out.println("子2のメソッド");
	}
}

main() クラスでは、二つのクラス Ko1, Ko2 クラスをインスタンス化しています。これら二つのクラスにとってのスーパークラスである Oya クラスのメソッド oyaMsg() も呼ばれていることに注目してください。

C:\Java>javac InheritDemo.java
C:\Java>java InheritDemo
----Call Ko1----
子1のメソッド
親のメソッド
----Call Ko2----
子2のメソッド
親のメソッド

継承の特徴



Copyright © 2001 SUGAI, Manabu. All Rights Reserved.