国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java8新特性之默認方法(default)淺析

2019-11-26 15:29:30
字體:
來源:轉載
供稿:網友

一、什么是默認方法,為什么要有默認方法

簡單說,就是接口可以有實現方法,而且不需要實現類去實現其方法。只需在方法名前面加個default關鍵字即可。

為什么要有這個特性?首先,之前的接口是個雙刃劍,好處是面向抽象而不是面向具體編程,缺陷是,當需要修改接口時候,需要修改全部實現該接口的類,目前的java 8之前的集合框架沒有foreach方法,通常能想到的解決辦法是在JDK里給相關的接口添加新的方法及實現。然而,對于已經發布的版本,是沒法在給接口添加新方法的同時不影響已有的實現。所以引進的默認方法。他們的目的是為了解決接口的修改與現有的實現不兼容的問題。

簡單的例子:一個接口A,Clazz類實現了接口A。

復制代碼 代碼如下:

public interface A {
    default void foo(){
       System.out.println("Calling A.foo()");
    }
}

public class Clazz implements A {
    public static void main(String[] args){
       Clazz clazz = new Clazz();
       clazz.foo();//調用A.foo()
    }
}


代碼是可以編譯的,即使Clazz類并沒有實現foo()方法。在接口A中提供了foo()方法的默認實現。

二、java 8抽象類與接口對比


這一個功能特性出來后,很多同學都反應了,java 8的接口都有實現方法了,跟抽象類還有什么區別?其實還是有的,請看下表對比。。

相同點不同點

1.都是抽象類型;

2.都可以有實現方法(以前接口不行);

3.都可以不需要實現類或者繼承者去實現所有方法,(以前不行,現在接口中默認方法不需要實現者實現)

1.抽象類不可以多重繼承,接口可以(無論是多重類型繼承還是多重行為繼承);

2.抽象類和接口所反映出的設計理念不同。其實抽象類表示的是"is-a"關系,接口表示的是"like-a"關系;

3.接口中定義的變量默認是public static final 型,且必須給其初值,所以實現類中不能重新定義,也不能改變其值;抽象類中的變量默認是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。


三、多重繼承的沖突說明

由于同一個方法可以從不同接口引入,自然而然的會有沖突的現象,默認方法判斷沖突的規則如下:

1.一個聲明在類里面的方法優先于任何默認方法(classes always win)

2.否則,則會優先選取最具體的實現,比如下面的例子 B重寫了A的hello方法。

輸出結果是:Hello World from B

如果想調用A的默認函數,則用到新語法X.super.m(...),下面修改C類,實現A接口,重寫一個hello方法,如下所示:

復制代碼 代碼如下:

public class C implements A{

    @Override
    public void hello(){
        A.super.hello();
    }

    public static void main(String[] args){
        new C().hello();
    }
}

輸出結果是:Hello World from A

四、總結

默認方法給予我們修改接口而不破壞原來的實現類的結構提供了便利,目前java 8的集合框架已經大量使用了默認方法來改進了,當我們最終開始使用Java 8的lambdas表達式時,提供給我們一個平滑的過渡體驗。也許將來我們會在API設計中看到更多的默認方法的應用。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 翁牛特旗| 和林格尔县| 迭部县| 吉首市| 康保县| 伊川县| 乌苏市| 通化县| 襄城县| 文昌市| 寿宁县| 珠海市| 旬邑县| 南宫市| 锦屏县| 璧山县| 伊川县| 日土县| 南川市| 阿克陶县| 龙陵县| 泗水县| 电白县| 巨鹿县| 武宣县| 镇巴县| 静海县| 潍坊市| 义马市| 贺州市| 泰宁县| 宁国市| 海宁市| 吴江市| 五峰| 江陵县| 曲麻莱县| 虞城县| 祁门县| 虞城县| 朝阳市|