#ざっくり違いを解説
######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 ・・・クラス等の修飾子