1. 程式人生 > >Java抽象類與介面的區別及default關鍵字學習總結

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