Java基礎ーインターフェースと抽象クラス

インターフェースと抽象クラス

1. インターフェース

実装のないメソッドを定義することができる。
インターフェースを実装したクラスにメソッドの実装を強制することができる。
⇒インターフェースをきちんと作れば実装漏れがなくなる。

宣言

public interface Sample {
}

メンバ変数・メソッド

メンバ変数
インターフェースではメンバ変数として宣言できるのは定数のみ。

public interface Sample {
    String phoneNumber;  // このように宣言しても、自動的に「public static final」が付加される
}

メソッド
インターフェースでは抽象メソッド・デフォルトメソッド・staticメソッド・privateメソッドが宣言可能。
このうち抽象メソッド以外は実装を持つメソッドである。

// インターフェースの定義  
public interface Sample {
    // defaultメソッド(publicが自動で付与される)
    default void defaultMethod(int x, int y) {
        print(apply(x, y));
    }

    // staticメソッド
    static void staticMethod() {
        System.out.println("static method");
    }

    // privateメソッド
    private void print(int z){
        System.out.println("result : " + z);
    }

    // 抽象メソッド(public abstractが自動的に付与される)
    int apply(int x, int y);
}

// インターフェースの実装
public class Multiplication implements Sample {
     // 抽象メソッドは実装クラスで実装する
    @Override
    public int apply(int x, int y) {
        return x * y;
    }
}

public class Main {
    public static void main(String[] args) {
        Multiplication multipl = new Multiplication();
        multipl.defaultMethod(2, 3); // result:6

         // staticメソッドはインターフェース名.メソッド名で呼ぶ
         // 実装クラスからは呼べない
         Sample.staticMethod();
    }
}
メソッドの種類 説明
抽象メソッド 実装クラスに処理を必ず書いてもらいたいときに使う
デフォルトメソッド インターフェースで共通な処理を書く。他のクラスに依存しないような処理をするに留める。
staticメソッド staticに呼んでほしい時に書く。他のクラスに依存しないような処理をするに留める。
privateメソッド 同一インターフェース内のstaticメソッドやデフォルトメソッドから使う

2. 抽象クラス

1つ以上の抽象メソッドを持つクラスのこと。

宣言

public abstract class AbstractSample {
}

メンバ変数・メソッド

メンバ変数
抽象クラスではメンバ変数は他のクラスと同じように使用できる

public abstract class AbstractSample {
    // 他のクラスと同様にメンバ変数として使用可能
    protected String name;
}

メソッド
抽象クラスでは、抽象メソッド以外の実装メソッドも自由に実装することができる

public abstract class AbstractSample {
    // 抽象メソッド
    public abstract String doSomething(String firstName, String lastName);

    // 実装メソッド
    protected void print(){
        System.out.println(name);
    }
}

public class Sample extends AbstractSample {
        // 抽象メソッドは実装クラスで実装する
       @Override
       public int doSomething(String firstName, String lastName) {
           return firstName + lastName;
       }
}

3. 抽象クラスとインターフェイスの差異

項目 抽象クラス インターフェイス
アクセス修飾子 public, protected public
メンバ変数 クラスのメンバ変数と同じ 定数のみ(自動でpublic static finalが付加される)
抽象メソッド 1つは定義する public abstractが自動的に付与される
実装を持つメソッド 実装可能 defaultメソッドとstaticメソッド, privateメソッドが実装可能
継承 多重継承不可 多重継承
使い分け 共通処理をまとめて処理の骨組みを作る クラスの型を定義する