第十七章 
 〜クラス編〜
 継承
 継承というのは、オブジェクト指向の特徴の1つでもある機能です〜。継承とは元々
あるクラスをベースにして新しいクラスを作るといったときに使う機能です〜。この
とき新しくできたクラスは、ベースにしたクラスの機能をすべて引き継ぐことができ
るです。そしてこのベースとなるクラスをスーパークラス、このスーパークラスを利用
して作った新しいクラスをサブクラスと言うです。
 例えば人間というクラスがあったとして、そのクラスには身長、体重、のようなフィ
ールドとご飯を食べるのような行動を持ってるです。
 そしてもう1つ、プログラマーというクラスがあったとして、そのクラスにも身長、
体重、のようなフィールドとご飯を食べるのような行動とさらに好きな言語というフィ
ールドとプログラミングというプログラムを作る行動をもってるです。
 この2つのクラスで、プログラマーというクラスは人間と言うクラスのフィールドや
行動を持ってるですね!考えてみればプログラマーも人間ですね!これを継承と言う最
初の説明に当てはめると、人間クラスがあってこれをベースにしてできたクラスがプロ
グラマークラスになるです。ちなみに人間クラスはスーパークラス、プログラーマクラ
スはサブクラスにあたるです。そして人間クラスをベースにしているのでこのクラスの
機能はすべてもってることになるです。つまりプログラマークラスで身長、体重、ご飯
を食べるといったフィールドや機能は書かなくても書いたことと同じになるです。
では実際にサンプルプログラムを見て行くです〜。
Rei17_1
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
class Rei17_1{
    public static void main(String[] args){
        Programmer tera = new Programmer(177, 61, "Java");

        tera.viewProgrammerStatus();
        tera.goEat();
        tera.goProgramming();
    }
}

class Human{
    protected int tall;
    protected int wait;

    public Human(int tall, int wait){
        this.tall = tall;
        this.wait = wait;
    }

    public void goEat(){
        System.out.println("ご飯を食べるです〜");
    }

    public void viewHumanStatus(){
        System.out.println(
            "身長:      " + tall + "\n" + "体重:      " + wait);
    }
}

class Programmer extends Human{
    private String likeLangage;

    public Programmer(int tall, int wait, String likeLangage){
        super(tall, wait);
        this.likeLangage = likeLangage;
        
    }

    public void goProgramming(){
        System.out.println("プログラムを作るです〜");
    }

    public void viewProgrammerStatus(){
        super.viewHumanStatus();
        System.out.println("好きな言語: " + likeLangage);
    }
}

 今回のプログラムではいつもより多く、3つのクラスが宣言されているですね!そし
て特に今回やるところで重要なのがProgrammerクラスです。このProgrammerクラスの右
extendsと言うキーワードが付いてるですね!これこそ今回の目玉で使う継承です。
このキーワードの右にくるのがベースとしたいクラス、スーパークラスです。
 継承したことによってProgrammerクラスでは、Humanクラスで宣言したフィールドや
メソッドを扱えるようになるです〜。でもprivateで宣言した物は扱えないです・・・
 今privateでは扱えないと言ったですが、だからと言ってpublicにしてしまうですと
どこからでもアクセスできてしまうですね!
 そこで今回新しく出てきたのがprotectedです。これは、以前アクセス修飾子で触れ
たと思うですが、そのときはサブクラスと言う言葉が出てきて終わってしまったです。
しかし今なら分かると思うです。つまりこの例で行くですと、自分以外にもサブクラス
のプログラマーならアクセスすることができると言うことです。まだパッケージについ
てやっていないのでここでは深くは言えないですが、実はこのプログラムだとメインメ
ソッドからでもアクセスできちゃったりするです・・・。
 34行目のsuper(tall, wait);は、いったい何をやっているかと言うですと、これは
スーパークラスのコンストラクタを自分で指定して呼びだしているです。もしこれを書
かないと、自動的に引数無しのスーパークラスのコンストラクタが呼び出されるですね
ただ今回の場合これを書かないとエラーになってしまうです。理由はスーパークラス側
で引数が無いコンストラクタが宣言されていないからです。
 そして重要なのが、このsuper(tall, wait);はコンストラクタの先頭に書かないとい
けないのです。なぜかと言うですと、まずサブクラスのコンストラクタが呼ばれたとき
このサンプルで言うですと、3行目のnew Programmer(177, 61, "Java");を呼んだとき
まずスーパークラスのコンストラクタの処理を最初に行うです。そしてサブクラスの
コンストラクタを処理するです。だから最初にsuper(tall, wait);を書かないといけ
ないのですね!
 スーパークラスのコンストラクタが先に呼ばれることを証明するサンプルを作って
みたです〜。このサンプルではsuper()を使ってないです。それでもスーパークラス
のコンストラクタが呼ばれることも証明できるです。
Rei17_2
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
class Rei17_2{
    public static void main(String[] args){
        Class2 sc = new Class2();
    }
}

class Class1{
    public Class1(){
        System.out.println("Class1のコンストラクタ");
    }
}

class Class2 extends Class1{
    public Class2(){
        System.out.println("Class2のコンストラクタ");
    }
}

 例17_1には、まだ1つだけ説明してないことがあったですね!それは44行目の
super.viewHumanStatus();です。これは、スーパークラスのviewHumanStatus()を呼び
出しているです。でもsuper.言うのは省略することができるのでviewHumanStatus()と
書いても動くです。これはthisのときと同じですね!と言うことは省略できない場合
も実はあったりするです。それは次の章でやるです。


今回のポイント
@ 元々あるクラスをベースにして新しいクラスを作る機能を継承と言う。
A ベースになるクラスをスーパークラス、
  スーパークラスを利用したクラスをサブクラスと言う。
B 書き方:class サブクラス名 extends スーパークラス名{}
C 最初に呼び出されるのはスーパークラスのコンストラクタ。
D サブクラスからでもアクセスできるようにしたい場合protectedを使う。
E スーパークラスの引数ありコンストラクタを呼び出す場合super(引数)を使う。
F super(引数)はサブクラスのコンストラクタの先頭に書く
G スーパークラスのフィールドやメソッドにアクセスする場合super.を使う(省略可)

TOPに戻る   Java講座に戻る