Revised: Dec./30th/2001: Since: Dec./30th/2001
ここでは、一つのクラスから別のクラスを作ってみます。例えば、「テレビ」クラスがあったとして、これに「録画」、「再生」メソッドを追加した「テレビデオ」クラスを作ろうということです。
継承 (extends) とは、あるクラスの実装を土台にして、別のクラスを実装するための方法です。元になるクラスをスーパークラスと呼び、それを継承する新しいクラスをサブクラス(継承クラス)と呼びます。
一つのクラスは、任意の個数のサブクラスを持つことが出来ますが、逆に、スーパークラスは一つしか持てません。これを単一継承と呼び、クラスは継承されることで枝葉を広げていく木構造を成しています。そして、遡っていけば根っ子となる一つのスーパークラス(ルート・クラス)に行きつきます。
クラスの木構造の頂点、ルートとなるクラスが Object クラスです。これは java.lang パッケージに含まれ、スーパークラスを明示しないクラスの場合、自動的にこのクラスから派生されたことになります。スーパークラスを明示した場合でも、そのクラスも Object クラスのサブクラスか、または Object クラスを継承したクラスのサブクラスのいずれかなので、最終的にはあらゆるクラスが Object クラスをスーパークラスに持つことに変わりはありません。
サブクラスは、「スーパークラスみたいなもの」、「スーパークラスの一種」だと言えます。「乗り物」が継承されて「自動車」が作られ、「自動車」を継承して「トラック」を作るようなもので、「トラック」は「自動車」の一種であり、更に「乗り物」の一種です。
また、サブクラスは、自身で実装したメソッドや変数に加えて、スーパークラスのメソッドや変数を全て継承して使えます。「トラック」は「自動車」の性質に独自の性質を加えたものであり、「自動車」は「乗り物」に独自の性質を加えたものです。
サブクラスは、スーパークラスの亜種/変種であり、スーパークラスの性質を全て備えています。
スーパークラスのメソッド呼び出しを例に考えると、JavaVM は実行時に、次のように継承関係の木構造を遡って、該当するメソッドを探します:
Object クラスのメソッドを探して、最初に見つかったメソッドに制御が移り、終了すれば呼び出し元に制御が戻ります。
既存のクラスから派生したクラスを作成したい場合、クラス定義時に 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のメソッド 親のメソッド