27
25

More than 3 years have passed since last update.

【JAVA】interfaceとabstractの違いって???

Last updated at Posted at 2019-12-19

ざっくり違いを解説

interface ・・・クラスじゃない(重要)
abstract ・・・クラス等の修飾子

interfaceについて

①変数

変数の宣言および実装ができる。
ただし、暗黙的に「public static final」が付く。

interface noTsukaikata {
    int Num = 6; //finalが付くので初期化できない。→実質的に定数扱いになる。
}
②メソッド

抽象化メソッドのみ宣言できる。

interface noTsukaikata {
    void method(); //抽象化メソッドの宣言(interface内のメソッドはabstract句が付与される)
    // abstract void method();に自動変換される。
}

実は、default句かstatic句を使うことで実装もできる。

interface deJisou{
    //default句を使うことで、interface内にメソッドを実装
    default void method1(){
        //more codes here
    }

    //static句を使うことで、interface内にメソッドを実装
    static void method2(){
        //more codes here
    }

    //default句かstatic句がないとコンパイルエラー
    void method3() {
        //more codes here
    }
}
③継承方法

interfaceはimplementsのみ継承可能です。
※interfaceで未実装のメソッドは全てオーバーライドしなければならない。

interface Super{
    int Num;
    default void method1(){
        //more codes here.
    }
    static void method2(){
        //more codes here.
    }
    void method3();
}

class Sub implements Super{
    //変数はfinalなので書く必要ない。

    //defaultメソッドは実装済みのため、Subクラスで実装しなくてよい。必要に応じてオーバーライド可能。

    //staticメソッドは継承対象外のため、Subクラスに実装できない。

    //method3を実装
    @Override 
    protected void method3(){//公開範囲(スコープ)が狭くならない限り、アクセス修飾子を変化させてもよい。
        //more codes here.
    }
}

上の継承によるSubクラスの中身は、以下の通り。


class Sub implements Super{
    int Num = 6;
    default void method1(){
        //more codes here.
    }
    //staticメソッドは継承対象外のためいない。
    protected void method3(){
        //more codes here.
    }
}

abstractについて

①変数

通常クラスと全く同じ扱い方。

abstract class Super {
    int Num1;      //宣言できる
    int Num2 = 6;  //初期化できる
    abstract int Num3 = 10;  //コンパイルエラー(変数を抽象化できない)
}
②メソッド

抽象化メソッドも宣言できる。

interface Super {
    abstract void method1(); //抽象メソッドを宣言できる。
    void method2() {}        //abstract句が無ければ実装もできる。
}
③継承方法

abstractはextendsのみ継承可能です。
※abstractメソッドは全てオーバーライドしなければならない。

abstract class Super {
    int Num1;
    int Num2 = 6;
    abstract void method1();
    void method2() {}
}

class Sub extends Super{
    @Override 
    void method1() {}
}

上の継承によるSubクラスの中身は、以下の通り。


class Sub extends Super{
    int Num1;
    int Num2 = 6;
    void method1() {}
    void method2() {}
}

結局何が違ったのか???

interface abstract
変数 自動的に「public static final」 通常クラスと全く同じ
メソッド 基本的に抽象メソッドのみ宣言できる。ただし、「default」や「static」句を利用し、実装できる。 抽象メソッドも宣言できる。
継承方法 implementsにより継承。サブクラスでは抽象メソッドをすべて実装する。 extendsにより継承。サブクラスでは抽象メソッドをすべて実装する。

補足

implementsとextendsの違いは???

implements・・・interfaceを継承する。
extends・・・クラスを継承する。

結論、

interface ・・・クラスじゃない
abstract ・・・クラス等の修飾子
27
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
25