🎯

【Java】クラス解説34・抽象クラス

2024/05/10に公開

抽象クラス

  1. 抽象クラスとは、クラス名の前にabstractを付けたインスタンス化できないクラスを指します。
    主にスーパークラスで使う事が多いです。スーパークラスは、共通のアクションや機能を実装し、サブクラスに具体的な実装を任せるためです。
  2. 抽象クラスで定義されたフィールドやメソッドは、サブクラスのインスタンスから参照することが可能です。

抽象クラスのコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 抽象クラスのインスタンスの生成
        Fuzi fz = new Fuzi();
    }
}
// 抽象クラス(スーパークラス)
abstract class Fuzi {
    
}
// サブクラス
class Sakura extends Fuzi {
    
}

このコードを実行すると、下記のエラーメッセージが出てきますので、抽象クラスがインスタンス化できないことが分かります。

Main.java:6: error: Fuzi is abstract; cannot be instantiated
        Fuzi fz = new Fuzi();
                  ^
1 error

サブクラスのインスタンスから抽象クラスにアクセスするコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // サブクラスのインスタンスの生成
        Sakura sk = new Sakura();
        // ポリモーフィズム
        sk.printNum();
    }
}

// 抽象クラス(スーパークラス)
abstract class Fuzi {
    // フィールド
    public int num;

    // コンストラクタ
    public Fuzi(int num) {
        this.num = num;
    }

    // メソッド
    public void printNum() {
        System.out.println(num);
    }
}

// サブクラス
class Sakura extends Fuzi {
    // コンストラクタ
    public Sakura() {
        // スーパークラスのコンストラクタを呼び出して、フィールド num を初期化
        super(39); 
    }

    // printNumメソッドのオーバーライド
    public void printNum() {
        System.out.println("サブクラス: " + num);
    }
}

出力結果

サブクラス: 39

出力結果より、下記のことが分かります。

  1. サブクラスのインスタンスから抽象クラスのフィールドにアクセスできたことが分かります。
    • サブクラスのインスタンス生成により、
    • サブクラスのコンストラクタが呼び出されて、
    • super()により、スーパークラスのコンストラクタを呼び出します。
    • 引数として渡された39が、this.numにより、スーパークラスのフィールドnumに代入されます。
  2. サブクラスのインスタンスから抽象クラスのメソッドにアクセスできたことが分かります。
    • サブクラスのインスタンスからprintNumメソッドを呼び出して、
    • スーパークラスのprintNumメソッドをオーバーライドしたサブクラスのprintNumメソッドが実行されます。

https://zenn.dev/goriki/articles/028-how-to-use-this1

https://zenn.dev/goriki/articles/032-how-to-use-super1

https://zenn.dev/goriki/articles/019-over-ride

Discussion