Java
2022.07.28
【初心者向け】Javaの継承とは?extendsの使い方をマスター!
2023.11.18

Javaプログラミング学習をするうえで、「継承ってなに?」と悩んでいる方も多いのではないでしょうか?


「Javaの継承(extends)とは?」

「継承する際の注意点は?」


といった疑問に対して、本記事ではJavaの継承について初心者エンジニア向けに詳しく解説していきます。



※本記事で紹介するサンプルコードは、Java18で動作確認しています。


1.Javaの継承(extends)とは?

Javaの継承(extends)とは、既存クラスのメソッドやフィールドの内容を引き継ぎながら、新しいクラスを定義することです。

継承元となるクラスのことを「スーパークラス」、継承した新しいクラスのことを「サブクラス」といいます。


2.継承の使いどころ


通常、同じような機能を持つクラスを複数作成する場合、すべてのクラスで同じようなコーディングをする必要があります。


そのような時、「継承」を利用すると、スーパークラスを作って機能を共通化し、サブクラスでは共通機能以外の固有機能だけを書きます。そうすると、コードの再利用性が高まり、コーディング作業効率が向上するのです。

スーパークラスとサブクラスのイメージ図

(*イメージ図)



3.インターフェース(implements)との違い


クラスに似た機能として、インターフェースがあります。インターフェースの場合は、「継承」ではなく、「実装(implements)」して利用します。


継承の主な役割はプログラムコードの再利用であることに対して、インターフェースの役割は「振る舞い」の共通化です。


また、継承の場合、複数のクラスを同時に継承できませんが、インターフェースは複数のインターフェースを実装できます。

インターフェースについては、こちらの記事で詳しく解説しているので、より詳しく知りたい方は確認してください。




4.extendsの使い方


では、具体的に継承(extends)の使い方を解説していきます。


「継承」の書き方は、サブクラス名の後にextendsを記述しスーパークラス名を指定します。

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

①スーパークラスを作成

まずは、継承元のスーパークラスを作成しましょう。

今回の例ではスーパークラスとして「Computerクラス」を作成します。

//スーパークラス
class Computer{
    int memorysize;
    String cpu;
    public void setMemorySize(int memorysize){
        this.memorysize = memorysize;
    }
    public void setCPUType(String cpu){
        this.cpu = cpu;
    }
    //スペックを表示
    public void dispSpec(){
        System.out.println("メモリは" + this.memorysize + "GBです。");
        System.out.println("CPUは" + this.cpu + "です。");
    }
}

このサンプルコードでは、「dispSpec」というスペックを表示するメソッドを定義したクラスを用意しています。

②スーパークラスを継承してサブクラスを作成

Javaで継承を使うには、サブクラス名のうしろに、「extends」を記述しスーパークラス名を指定します。サンプルコードで確認してみましょう。

//サブクラス
class NotePC extends Computer{
    double weight;
    public void setWeight(int weight){
        this.weight = weight;
    }
    //スペックを表示
    public void dispSpec(){
        super.dispSpec();
        System.out.println("重量は" + this.weight + "Kgです。");
    }
}

このサンプルコードでは、NotePCクラスがComputerクラスを継承しています。NotePCクラスでは、Computerクラスの「dispSpec」を引き継ぎつつ、NotePCクラス独自の機能を追加しています。



5.スーパークラスのコンストラクタやメソッドをオーバーライドする方法


この章では、スーパークラスのメソッドをサブクラスで定義し直す、オーバーライドの解説をします。

①オーバーライドとは?

スーパークラスで定義されたメソッドをサブクラスで独自に再定義することを「オーバーライド」と言います。サブクラスで機能を変更したい時に、オーバーライドを利用します。


オーバーライドは、変更が必要な場合でも、変更箇所が少なくて済むので、保守性が高くなる、といった点がメリットです。

②オーバーライドの条件

オーバーライドする際には、以下の条件が必須です。


・メソッド名、引数の型・順番・数、戻り値が同じであること

・スーパークラスのメソッドに指定されるアクセスレベルと同じか緩い制限であること

例えば、スーパークラスのメソッドにprotectedが指定されている場合、オーバーライドする側のメソッドにprivateを指定することはできません。

③サンプル

ここで、サンプルコードを用いてオーバーライドの具体的な使い方について解説します。

public class App {
    public static void main(String[] args) {
        //サブクラスをインスタンス化
        NotePC npc = new NotePC();
        npc.setMemorySize(256);
        npc.dispSpec();
    }
}

//スーパークラス
class Computer{
    int memorysize;
    public void setMemorySize(int memorysize){
        this.memorysize = memorysize;
    }
    //コンストラクタ
    public Computer(){
    }
    //スペックを表示
    public void dispSpec(){
        System.out.println("コンピュータのメモリは" + this.memorysize + "GBです。");
    }
}

//サブクラス
class NotePC extends Computer{
    public NotePC(){
    }
    //オーバーライド
    public void dispSpec(){
        System.out.println("ノートパソコンのメモリは" + this.memorysize + "GBです。");
    }
}

実行結果

ノートパソコンのメモリは256GBです。

このサンプルコードでは、NotePCクラスがComputerクラスを継承しています。


スーパークラスのdispSpecメソッドをNotePCクラスでオーバーライドして処理を変更。実行クラスMainでサブクラスをインスタンス化して、NotePCクラスのdispSpecメソッドを実行しています。


6.スーパークラスのコンストラクタやメソッドを呼び出す方法


superを使用すると、サブクラスからスーパークラスのコンストラクタやメソッドを呼び出せたり、スーパークラスのフィールドを参照できたりします。


superについてはこちらの記事で詳しく解説しているので、参考にしてください。




7.継承する際の注意点

最後に、継承を使う際の注意点を見ていきましょう。

①複数のクラスを同時に継承はできない

サンプルコードのように、複数のクラスを同時に継承することはできません。

class tablet extends Computer,NotePC{
    
}

②final修飾子がついたクラスは継承できない

final修飾子がついたクラスはオーバーライドできないメソッドになります。チーム開発において、処理を勝手に変更されたくない場合に付けましょう。

③private修飾子はサブクラスから利用できない

スーパークラスでprivate修飾子をつけて宣言されたフィールド変数やメソッドは、サブクラスから利用することはできません。

④コンストラクタは継承されない

継承されたクラスでコンストラクタを記述するときは注意が必要です。サンプルコードで確認してみましょう。

public class App {
    public static void main(String[] args) {
        //サブクラスをインスタンス化
        NotePC npc = new NotePC();
        npc.setMemorySize(256);
        npc.dispSpec();
    }
}

//スーパークラス
class Computer{
    int memorysize;
    public void setMemorySize(int memorysize){
        this.memorysize = memorysize;
    }
    //スーパークラスのコンストラクタ
    public Computer(){
        System.out.println("Computerクラスのコンストラクタ");
    }
    //スペックを表示
    public void dispSpec(){
        System.out.println("コンピュータのメモリは" + this.memorysize + "GBです。");
    }
}

//サブクラス
class NotePC extends Computer{
    //サブクラスのコンストラクタ
    public NotePC(){
        System.out.println("NotePCクラスのコンストラクタ");
    }
    //オーバーライド
    public void dispSpec(){
        System.out.println("ノートパソコンのメモリは" + this.memorysize + "GBです。");
    }
}

実行結果:

Computerクラスのコンストラクタ
NotePCクラスのコンストラクタ
ノートパソコンのメモリは256GBです。

サブクラスでコンストラクタを上書きしようとしても、暗黙的にスーパークラスのコンストラクタが実行されてしまいます。


また、サブクラスにコンストラクタがない場合でも、スーパークラスのコンストラクタは実行されるので、注意が必要です。


この記事をシェア