Java8接口新特性

概述

Java 8中,你能夠爲接口添加靜態方法默認方法。從技術角度來講,這是徹底合法的,只是它看起來違反了接口做爲一個抽象定義的理念。猜測設計初衷可能使爲了兼容8如下的jdk Java8出來了個函數式接口,只要聲明成函數式接口的接口都只能有一個抽象方法,爲了便於擴展,賦予接口這麼一個新特性
靜態方法:使用 static 關鍵字修飾。能夠經過接口直接調用靜態方法,並執行其方法體。咱們常常在相互一塊兒使用的類中使用靜態方法。你能夠在標準庫中找到像Collection/Collections或者Path/Paths這樣成對的接口和類。
默認方法:默認方法使用 default 關鍵字修飾。能夠經過實現類對象來調用。咱們在已有的接口中提供新方法的同時,還保持了與舊版本代碼的兼容性。
好比:java 8 API中對Collection、List、Comparator等接口提供了豐富的默認方法。java

接口默認方法的類優先原則

若一個接口中定義了一個默認方法,而另一個父類或接口中又定義了一個同名的方法時
選擇父類中的方法。若是一個父類提供了具體的實現,那麼接口中具備相同名稱和參數的默認方法會被忽略。
看例子:ide

package com.xnn.newInterface;

/**
 * 類(接口)描述:
 * @author xnn
 * 2018年10月25日下午3:56:46
 */
public interface Myfun {
    //新增了默認方法     有方法體了
default String getName() {
    return "return "接口中的getName方法";
}
//還能夠寫靜態方法       
public static void show() {
    System.out.println("Java8接口中的靜態方法");
}
}

package com.xnn.newInterface;

/**
 * 類(接口)描述:
 * @author xnn
 * 2018年10月25日下午3:59:20
 */
public class Myclass {
public String getName() {
    return "類中的getName()方法";
}
}


package com.xnn.newInterface;

/**
 * 類(接口)描述:既繼承 又實現   遵循類優先原則 
 * @author xnn
 * 2018年10月25日下午4:00:29
 */
public class MYsubClass  extends Myclass implements Myfun {

}
package com.xnn.newInterface;

/**
 * 類(接口)描述:
 * @author xnn
 * 2018年10月25日下午4:01:41
 */
public class TEst {
public static void main(String[] args) {
    MYsubClass class1 = new MYsubClass();
    //調類裏面的方法
    System.out.println(class1.getName());
    Myfun.show();
}
}

結果函數

類中的getName()方法
Java8接口中的靜態方法

接口衝突

若是一個父接口提供一個默認方法,而另外一個接口也提供了一個具備相同名稱和參數列表的方法(無論方法是不是默認方法),那麼實現類必須覆蓋該方法來解決衝突
例子:設計

package com.xnn.newInterface;

/**
 * 類(接口)描述:
 * @author xnn
 * 2018年10月25日下午3:56:46
 */
public interface Myfun {
    //新增了默認方法     有方法體了
default String getName() {
    return "接口中的getName方法";
}
//還能夠寫靜態方法       
public static void show() {
    System.out.println("Java8接口中的靜態方法");
}
}


package com.xnn.newInterface;

/**
 * 類(接口)描述:
 * @author xnn
 * 2018年10月25日下午4:03:45
 */
public interface MyInterface {
    default String getName() {
        return "MYin接口"
    ;
    }
}


package com.xnn.newInterface;

/**
 * 類(接口)描述:
 * @author xnn
 * 2018年10月25日下午3:59:20
 */
public class Myclass {
public String getName() {
    return "類中的getName()方法";
}
}

package com.xnn.newInterface;

/**
 * 類(接口)描述:實現兩個接口時 必須指定一個來解決衝突
 * @author xnn
 * 2018年10月25日下午4:00:29
 */
public class MYsubClass   implements Myfun,MyInterface {

    
    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return Myfun.super.getName();
    }

}
相關文章
相關標籤/搜索