Java 8 接口

Java8 之前的接口定义中,方法的方法体必须是空的,接口不允许定义实例变量。并且接口实现类必须实现接口定义的所有方法。从Java 8 开始,接口可以定义默认方法,而且所有接口实现类都可以改方法及实现。

默认方法和抽象方法的区别是抽象方法必须要被实现,默认方法不是。作为替代方式,接口可以提供一个默认的方法实现,所有这个接口的实现类都会通过继承得到这个方法(如果有需要也可以重写这个方法)

默认方法定义

public interface DefaultFuncInter {
    int getInt();
    default String getString(){
        return "Default String";
    }
}

默认方法优势

  • 提供一种拓展接口的方法,而不破坏现有代码。

假如我们有一个已经投入使用的接口需要拓展一个新的方法,在JDK8以前,如果为一个使用的接口增加一个新方法,则我们必须在所有实现类中添加该方法的实现,否则编译会出现异常。如果实现类数量少并且我们有权限修改,可能会工作量相对较少。如果实现类比较多或者我们没有权限修改实现类源代码,这样可能就比较麻烦。而默认方法则解决了这个问题,它提供了一个实现,当没有显示提供其他实现时就采用这个实现。这样新添加的方法将不会破坏现有代码。

注意:扩展方法不能够重写(也称复写或覆盖) Object 中的方法,却可以重载Object 中的方法。

  • 默认方法是可选的,子类可以根据不同的需求Override默认实现。

例如,我们定义一个集合接口,其中有增、删、改等操作。如果我们的实现类90%都是以数组保存数据,那么我们可以定义针对这些方法给出默认实现,而对于其他非数组集合或者有其他类似业务,可以选择性复写接口中默认方法。

多重继承的冲突说明:

由于同一个方法可以从不同接口引入,自然而然的会有冲突的现象,规则如下:

1)一个声明在类里面的方法优先于任何默认方法

2)优先选取最具体的实现

3)如果继承多个同名的默认方法,则必须在类中重写默认方法,提高优先级。

接口静态方法

Java8接口中可以定义静态方法,只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。类似类的静态方法。

public interface DefaultFuncInter {
    int getInt();
    static int add(int a,int b){
        return a + b;
    }
}

由于静态方法只能通过接口来类来调用,所以不会出现多个接口的相同方法冲突的问题。

函数式接口

Java8开始支持Lambda表达式,一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。

@FunctionalInterface
interface Converter<F, T> {
    T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);    // 123
 

逻辑与 符号

   public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
            return (Comparator<Map.Entry<K, V>> & Serializable)
                (c1, c2) -> c1.getKey().compareTo(c2.getKey());
        }
 

& 表示lambda表达式是可以转换成的对象,可以满足2个接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值