抽象クラスとインターフェイスの違い・使い分け (Java版)

解説

抽象クラスとインターフェイスは、プログラミングで「ルール」を作るための道具だな。簡単に言うと、「抽象クラス」は基本的なルールや機能を持った設計図、「インターフェイス」はルールだけを定めるための契約書のようなものだ。

Javaでの抽象クラスとインターフェイスの実装

抽象クラス

まずは、抽象クラスのイメージを「動物園の動物たち」で考えてみよう。


        // 抽象クラス
        abstract class Animal {
            // すべての動物は鳴くけど、どんな風に鳴くかは動物による
            abstract void makeSound();
            
            // すべての動物には名前がある
            String name;
        
            // 名前を設定するメソッド(どの動物も同じ)
            public void setName(String name) {
                this.name = name;
            }
        
            // 名前を取得するメソッド(どの動物も同じ)
            public String getName() {
                return this.name;
            }
        }
        
        // 猫クラス
        class Cat extends Animal {
            @Override
            void makeSound() {
                System.out.println("にゃー");
            }
        }
        
        // 犬クラス
        class Dog extends Animal {
            @Override
            void makeSound() {
                System.out.println("わんわん");
            }
        }
    

抽象クラスのポイント

インターフェイス

次に、インターフェイスは「動物が飛べるか泳げるか」をルールにして考えよう。インターフェイスは「やり方」は決めず、「こういうことができるよ」というルールだけを決める。


        // 飛べる動物たちのルール
        interface Flyable {
            void fly();
        }
        
        // 泳げる動物たちのルール
        interface Swimmable {
            void swim();
        }
        
        // 鳥クラス
        class Bird extends Animal implements Flyable {
            @Override
            void makeSound() {
                System.out.println("ぴよぴよ");
            }
        
            @Override
            public void fly() {
                System.out.println("鳥が飛んでいる");
            }
        }
        
        // 魚クラス
        class Fish extends Animal implements Swimmable {
            @Override
            void makeSound() {
                System.out.println("...");
            }
        
            @Override
            public void swim() {
                System.out.println("魚が泳いでいる");
            }
        }
        
    

インターフェイスのポイント

抽象クラスとインターフェイスの違いまとめ

抽象クラス:

インターフェイス:

使い分けのポイント