継承とは

オブジェクト指向を使ったプログラミングでは、既存のクラスを継承して新しいクラスを定義することができます。元になるクラスをスーパークラス、継承して作成したクラスをサブクラスといいます。クラスを継承すると、スーパークラスで定義されているフィールドやメソッドをサブクラスで引き継いで利用することができます。スーパークラスに共通するメソッドをまとめて定義しておけば、サブクラスごとに同じメソッドを何度も記述する必要がありません。ここではオブジェクト指向におけるクラスの継承について解説します。

継承とは

オブジェクト指向では、すでに作成したクラスを元にして新しいクラスを作成することができます。このように既存のクラスの機能を引き継いで新しいクラスを作成する仕組みを継承といいます。

継承を利用することで、共通するデータや処理をまとめて管理することができます。また同じコードを何度も記述する必要がなくなるため、プログラムを効率よく作成することができます。

継承では元になるクラスのことをスーパークラス、そこから作成されるクラスのことをサブクラスと呼びます。一つのスーパークラスから複数のサブクラスを作成できます。

例えば次のような「電化製品」と「食料品」のクラスがあるとします。この 2 つのクラスは「名前」と「値段」という共通するデータを持っています。

継承とは(1)

共通するデータを「製品」クラスとしてまとめて定義し、「電化製品」と「食料品」のクラスは「製品」クラスを継承して作成するようにします。このとき「製品」クラスがスーパークラス、「電化製品」と「食料品」がサブクラスとなります。

継承とは(2)

共通するデータについてはスーパークラスの方でまとめて管理し、サブクラスが独自に扱うデータは、それぞれのサブクラスで管理します。

このように共通するデータや処理をスーパークラスで定義することで、重複したコードを減らすことができます。またサブクラスがそれぞれ独立したものではなく、同じスーパークラスを持つ関連したクラスであることを明確にできます。

継承の書き方

Java でクラスを継承する場合は extends を使用します。スーパークラスの方は通常のクラスと同じ記述方法です。サブクラスについては次のように記述します。

class サブクラス名 extends スーパークラス名 {
}

先ほどの「製品」に関する例であれば、次のように記述できます。

// スーパークラス
class 製品 {
}

// サブクラス
class 電化製品 extends 製品 {
}

// サブクラス
class 食料品 extends 製品 {
}

同じスーパークラスを継承するサブクラスを複数定義することができます。

サブクラスのオブジェクトからスーパークラスのメソッドを呼び出す

クラスを継承すると、サブクラスはスーパークラスで定義されているフィールドやメソッドを引き継ぎます。そのため、サブクラスのオブジェクトを作成した場合でも、スーパークラスで定義されたメソッドを呼び出すことができます。これはサブクラスがスーパークラスの機能を受け継いでいるためです。

例えば次のような Product クラスと Food クラスがあるとします。 Food クラスは Product クラスを継承しています。

class Product {
  private int price;

  public void showPrice() {
    System.out.println("価格: " + price);
  }
}

class Food extends Product {
  private String place; 

  public void showPlace() {
    System.out.println("原産地: " + place);
  }
}

Product クラスでは showPrice メソッドを定義しています。 Food クラスでは showPrice メソッドを定義していませんが、 Product クラスを継承しているため、サブクラスのオブジェクトはこのメソッドを利用することができます。

public class Sample {
  public static void main(String[] args) {
    Food f = new Food();

    f.showPrice();
  }
}

サブクラスのオブジェクトはスーパークラスで定義されているメソッドだけでなく、サブクラスで定義されているメソッドも利用できます。

public class Sample {
  public static void main(String[] args) {
    Food f = new Food();

    f.showPrice();
    f.showPlace();
  }
}

このようにサブクラスのオブジェクトでは、スーパークラスから受け継いだメソッドと、サブクラスで定義したメソッドの両方を利用することができます。

サンプルコード

では簡単なサンプルを作って試してみます。テキストエディタで次のように記述したあと、 Sample.java という名前で保存します。

public class Sample {
  public static void main(String[] args) {
    Foods f = new Foods("アメリカ", "オレンジ");

    System.out.println("名前は" + f.getName() + "です");
    System.out.println("原産地は" + f.getPlace() + "です");
  }
}

class Product {
  private String name;

  public void setName(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }
}

class Foods extends Product {
  private String place; 

  Foods (String place, String name) {
    this.place = place;
    setName(name);
  }

  public String getPlace() {
    return place;
  }
}

コンパイルを行います。

javac -encoding UTF-8 Sample.java

その後で、次のように実行してください。

java Sample

継承とは(1)

Product をスーパークラスに持つ Foods クラスを定義しました。 Foods クラスのオブジェクトを作成したあと、 Foods クラスで定義されているメソッドと、スーパークラスの Product クラスで定義されているメソッドをそれぞれ呼び出しました。このようにサブクラスのオブジェクトを作成すると、サブクラスのメソッドだけでなくスーパークラスのメソッドも利用できます。

今回のサンプルはスーパークラスのコンストラクタを利用しない方法で作成しました。次のページではサブクラスからスーパークラスのコンストラクタを利用する方法について解説します。

-- --

オブジェクト指向におけるクラスの継承について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。