Javaクラスの継承(Inheritance)

継承(Inheritance)

継承は、階層的な分類を作るオブジェクト指向プログラムにおける重要な概念の一つです。複数のクラスが持つべき共通項目だけを集めて一般的なクラスを作成できるため、モジュールの再利用性(reusing)とコードの簡潔さを提供します。

継承される上位クラスをスーパークラス(Super Class)または親クラス(Parent Class)と呼び、継承を受ける下位クラスをサブクラス(Sub Class)または子クラス(child class)と呼びます。

既存の上位クラスからすべての属性とメソッドを継承し、さらに必要な属性とメソッドを追加して新しいクラスを作成できます。

Javaのすべてのクラスは上位クラスを持ちます。Javaプログラムで使用できるクラスのうち、最上位クラスはjava.lang.Objectクラスです。つまり、JavaプログラムのすべてのクラスはObjectクラスの下位クラスになります。明示的に上位クラスを指定しない場合、暗黙的にObjectを継承するものと見なされます。

Javaで継承させるには、新しいクラス名の後にextendsを書き、継承したいクラスを指定します。

[public/final/abstract] class クラス名 extends 上位クラス名 {
    // メンバー変数宣言
    // コンストラクタ
    // メソッド宣言
}

例1

package com.devkuma.tutorial.inheritance;

public class Parent {

    int a;
    int b;

    public int sum() {
        return a + b;
    }
}
package com.devkuma.tutorial.inheritance;

public class Child extends Parent {

    public int multiply() {
        return a * b;
    }
}
package com.devkuma.tutorial.inheritance;

public class Inheritance {

    public static void main(String[] args) {

        Child child = new Child();

        System.out.println("sum=" + child.sum());
        System.out.println("multiply=" + child.multiply());
    }
}

実行結果:

sum=5
multiply=6

例を見ると、ChildクラスがParentクラスを継承し、InheritanceChildを生成してsumメソッドとmultiplyメソッドの結果を表示しています。これは、ChildクラスがParentのメンバー変数abとメソッドsumを継承したためsumメソッドを呼び出せ、multiplyメソッドでParentクラスのメンバー変数abを使用できたということです。

super予約語

superは、継承関係で下位クラスが上位クラスのメンバーにアクセスするために使用する予約語(keyword)です。

  • 下位クラスによって隠された上位クラスのメンバー変数やメソッドにアクセスするときに使います。
  • 上位クラスのコンストラクタを呼び出すために使います。
super.オブジェクト変数
super.メソッド(パラメータ)

メソッドのオーバーライド(Overriding)

継承関係で、下位クラスのメソッドが上位クラスのメソッドと同じ名前で宣言されるとき、サブクラスのメソッドは上位クラスのメソッドをオーバーライド(Overriding)すると言います。

オーバーライドでは、上位クラスのメソッドと下位クラスのメソッドが、メソッド名だけでなく、パラメータの型と数、戻り値型まで同じでなければなりません。もしメソッド名は一致していても、メソッドのパラメータの数や型が異なる場合は、継承関係にあるためメソッドのオーバーロード(Overloading)になります。

継承関係にあるクラスでメソッドがオーバーライドされた場合、上位クラスのメソッドは下位クラスによって隠されます。下位クラスのオブジェクトから、上位クラスでオーバーライドされたメソッドを使用するには、予約語superを使います。