函数式接口@FunctionalInterface的使用说明

首先说下,在JDK1.8中,interface更牛逼了……

a、可以有default方法

b、可以有static方法

什么是函数式接口

所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。

这种类型的接口也称为SAM接口,即Single Abstract Method interfaces

1、代码

public interface Test {
    void shout();
 
    default void jump() {
        System.out.print("default jump()");
    }
 
    static void desc() {
        System.out.print("static desc()");
    }
}

a、default方法访问权限默认就是public(不填写时)

b、static方法也是权限默认就是public(不填写时)

c、private、protected均不能修饰defaut与static方法(跟interface原有规则保持一致)

2、default与static方法的调用方式,写一个实现Test 接口的Dog类

public class Dog implements Test {
 
    @Override
    public void shout() {
 
    }
 
    public static void main(String[] args) {
        Dog myDog = new Dog();
        myDog.jump();
        Action.desc();
    }
 
}

a、default方法通过实现类对象调用

b、static方法只能通过interface名称调用

3、重写情况

a、default方法支持实现类重写

b、static方法不支持实现类重写

4、冲突与技巧

a、多个接口有同名的default方法

interfaceFirst与interfaceSecond同时定义了一个相同方法签名的default方法,此时他们的实现类必须重写该default方法

b、重写default方法时,如何去调用原有interface中的default方法

在重写的default方法中,可以使用interfaceFirst.super.xxx()的方式,调用原有任意一个interface中的default方法

c、父亲与interface的default方法同名

父类与interface中的default方法有相同的方法签名的方法时,子类继承的是父类的方法,而default会被忽略……

特点

接口有且仅有一个抽象方法
允许定义静态方法
允许定义默认方法
允许java.lang.Object中的public方法
该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错
// 正确的函数式接口
@FunctionalInterface

public interface TestInterface {
 
    // 抽象方法
    public void sub();
 
    // java.lang.Object中的public方法
    public boolean equals(Object var1);
 
    // 默认方法
    public default void defaultMethod(){
    
    }
 
    // 静态方法
    public static void staticMethod(){
 
    }
}

// 错误的函数式接口(有多个抽象方法)
@FunctionalInterface
public interface TestInterface2 {

    void add();
    
    void sub();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值