トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Javaの文法:継承

継承

 継承とは

辞書(「大辞林第二版」)によれば「継承」とは

継承 【けいしょう】

(名)スル

先の人の身分・権利・義務・財産などを受け継ぐこと。「王位を―する」


となっている。オブジェクト指向言語のプログラミングにおける継承もこの辞書的意味から類推できるものであり、既存のクラスに基づいて新しいクラスを作成し、属性や関数を元クラスから引き継ぐものである。

 スーパークラス(親クラス)とサブクラス(子クラス)

継承を行ったさいに元となるクラスをスーパークラス、継承によって作成されたクラスをサブクラスと呼ぶ。スーパークラスのことを基底クラス、サブクラスのことを派生クラスと呼ぶこともある。

 extends

スーパークラスを継承するサブクラスを作成する場合には、extends文を用いる。
例)

class Lion extends Animal {
}

final修飾子がつけられたクラス

アクセス修飾子としてfinalが付与されたクラスは継承してサブクラスを作成することができない。

 キーワードsuper

当該オブジェクト自身を指すthisキーワードと同じような形で、継承におけるスーパークラスの変数やメソッドはsuperキーワードを用いることで、参照したり、呼び出すことができる。

継承とコンストラクタ

  • クラスの継承を行った場合、スーパークラスのコンストラクタはサブクラスに自動的に継承されない。スーパークラスのコンストラクタを呼び出す必要がある場合には、サブクラスのコンストラクタにおいて、super(<パラメータ>)という形で呼び出すことになる。なお、super(<パラメータ>)はサブクラスのコンストラクタ中の処理の一番最初に記述しなくてはならない。
  • スーパークラスでデフォルトコンストラクタ(パラメータなしのコンストラクタ)が定義されており、サブクラスでコンストラクタが定義されていない場合に、パラメータなしでサブクラスをインスタンス化を行うとスーパークラスのデフォルトコンストラクタが呼び出される。

 オーバーライド

  • サブクラスでスーパークラスの同一引数、同一戻り値のメソッドを上書きすること。サブクラスのオブジェクトでそのメソッドを呼び出した場合に、スーパクラスのメソッドではなく、サブクラスのメソッドが呼び出される。
  • なお、JavaSE5.0以降では@Overrideアノテーションをメソッドにつけることにより明示的にオーバーライドを行った方が望ましい。

final修飾子がつけられたメソッド

アクセス修飾子としてfinalが付与されたメソッドはサブクラスでのオーバーライドはできない。

 (参考)オーバーロード

同じクラス内で、引数の数、引数の並び順が異なる複数のメソッドを定義し、呼ばれ方によって処理を分岐させる。ただし、あまりに挙動が異なるメソッドをオーバーロードするとわかりにくくなるので注意。

 継承を用いたクラスの例

クラス階層図

Personクラスを継承して、TeacherクラスとStudentクラスがあるとする

クラスのコード

sampleClassというパッケージを作成し、その下に以下の4つのファイルをコピーする。実行はpublic static void main(String[] args)のあるSampleExecuteから行う。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package sample.object;

class Person {
    String firstName;    //名
    String lastName;    //姓
    int age;    //年齢
    int height;    //身長
    int weight;    //体重
    Person(String firstName, String lastName, int age) {
        this.firstName=firstName;
        this.lastName=lastName;
        this.age=age;
    }
    String getProfile() {
        return "名前は"+lastName+" "+firstName+"です。"+age+"才です。";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package sample.object;

public class Teacher extends Person {
    Teacher(String firstName, String lastName, int age,
            String school, String position) {
        super(firstName, lastName, age);
        this.school=school;
        this.position=position;
    }
    String school;    //学校
    String position;    //職位
    @Override
    String getProfile() {
        return super.getProfile()
            +school+"という学校で働いています。今は"+position+"です。";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package sample.object;

public class Student extends Person {
    Student(String firstName, String lastName, int age,
            String school,int academicYear) {
        super(firstName, lastName, age);
        this.school=school;
        this.academicYear=academicYear;
    }
    String school;    //学校
    int academicYear;    //学年
    @Override
    String getProfile() {
        return super.getProfile()+
            "学校は"+school+"で"+academicYear+"年生です。";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
package sample.object;

public class SampleExecute {
    public static void main(String[] args) {
        Person tanaka = new Person("一郎","田中",35);
        System.out.println(tanaka.getProfile());
        Student suzuki = new Student("五郎","鈴木",18,"A大",1);
        System.out.println(suzuki.getProfile());
        Teacher kemeta = new Teacher("義弘","ケメ田",50,"A大","教授");
        System.out.println(kemeta.getProfile());
    }
}

 課題

  1. いつでもtrueを戻すboolean型が戻り値のisRobot()というメソッドと「コンニチハ」を戻すString型が戻り値のhello()という二つのメソッドを持つRobotというクラスをパッケージrobot内に作成しなさい
  2. 上記のクラス(Robot)を実行する以下のようなtestRobotクラスを作成しなさい。
  3. 上記のクラス(Robot)を継承したArarechanクラスを作成し、hello()を「んちゃ」を返すようにオーバーライドしなさい。また、testRobotにArarechanに対してRobotと同様の操作をするような処理を追加しなさい。
  4. 上記のクラス(Robot)を継承したDoraemonクラスを作成し、hello()を「ぼくドラえもん」を返すようにオーバーライドしなさい。また、testRobotにDoraemonに対してRobotと同様の操作をするような処理を追加しなさい。

testRobotクラス

1
2
3
4
5
6
7
8
9
package robot;

class TestRobot {
    public static void main(String[] args) {
        Robot robot = new Robot();
        System.out.println("ロボットですか? -> "+robot.isRobot());
        System.out.println("こんにちは -> "+robot.hello());
    }
}
Person.java PersonClassDiagram.png SampleExecute.java Student.java Teacher.java

最終更新時間:2008年06月04日 19時48分24秒