Java抽象類與介面的區別及default關鍵字學習總結
抽象類
可看做是不可例項化的普通類,可以擁有構造方法,可以有main方法
抽象類中的方法可以是抽象方法(抽象方法必須存在於抽象類中),也可以是普通方法、靜態方法
可以宣告變數
抽象類可以繼承其它類,也可實現介面
抽象類的派生類,必須覆蓋父類中abstract修飾的所有方法
介面
介面僅可繼承其他介面,不可繼承其它類或實現另外的介面
介面中的方法預設為abstract型別
介面中宣告的變數必須賦初值,且不可再改變,因為所有變數都是static final型別的
對於JDK7及以前版本:
1. 介面中的方法不可有方法體(因為預設是抽象方法),不可有靜態方法。
2. 介面的實現類,必須實現介面中的所有方法(包括介面本身的和從其它介面繼承的)
對於JDK8及以後版本:
1. 介面中default方法可有方法體,也可在接口裡寫靜態方法。
2. 介面的實現類,必須實現介面中除default型別的其它所有方法(包括介面本身的和從其它介面繼承的)
再說說default關鍵字:
用來修飾方法,使得在介面中也可以寫入方法體
介面的實現類若沒有實現(也可以叫覆蓋)default型別的方法,則可在實現類中直接呼叫(介面says:你不覆蓋,那就按這個來了啊)。否則,是正常的覆蓋,實現多型。
個人理解:default的加入,使得我們在介面類中增加方法時,不必一個個地改動實現類了(新增一個default方法時,實現類可以不去管),使得介面和抽象類更為貼近了一步。
附上一個實驗例子,兩個介面是繼承關係,一個類來實現其中一個介面,實驗各種呼叫:
interface BaseRadio { void sent(String a,String b); int port = 9800; default void close() { System.out.println(port); System.out.println("關了"); } static void prt(){ System.out.println("uvb77"); } default void open() { System.out.println("開啟"); } }
interface Radio extends BaseRadio {
void sent();
void sent(int s);
int sent(String a);
@Override
default void close() {
System.out.println(port + 1);
System.out.println("我是Radio重寫的");
}
static void prt(){
System.out.println("uvb76");
}
}
public class TestRadio implements Radio {
@Override
public void sent() {
System.out.println("我是BaseRadio裡的");
}
@Override
public void sent(int s) {
System.out.println("我是BaseRadio裡的");
}
@Override
public int sent(String a) {
System.out.println("我是BaseRadio裡的");
return 0;
}
@Override
public void sent(String a, String b) {
System.out.println("我是Radio裡的!!!!!");
}
@Override
public void close() {
System.out.println(port + 2);
System.out.println("我是TestRadio重寫的");
}
public static void main(String[] args) {
TestRadio testRadio = new TestRadio();
System.out.println("呼叫實現類覆蓋的default方法,經過了2次覆蓋,已經和原來完全不同了:");
testRadio.close();
System.out.println("實現類呼叫BaseRadio介面的default方法,就好像自己的方法哦:");
testRadio.open();
System.out.println("列印接口裡宣告的port:" + TestRadio.port);
Radio.prt();
System.out.println("呼叫介面的靜態方法");
BaseRadio.prt();
}
}
最終輸出如下:
呼叫實現類覆蓋的default方法,經過了2次覆蓋,已經和原來完全不同了:
9802
我是TestRadio重寫的
實現類呼叫BaseRadio介面的default方法,就好像自己的方法哦:
開啟
列印接口裡宣告的port:9800
uvb76
呼叫介面的靜態方法
uvb77