java8接口新特性--default、static方法

为什么要引入接口新特性:

某些时候,实现我们定义的接口的所有类,对接口中的抽象方法重写时,实现的功能可能是完全一致的,此时引入default关键字可以进一步抽象。

接口的定义:
// @FunctionalInterface -->如果加此注解表明该接口是一个函数式接口,只能有一个抽象方法
public interface DefaultAndStaticDemo1 {
    /**
     * 被default定义的方法:
     *      1. 可以直接在里面写方法体,
     *      2. 不需要被实现的类重写
     *      3. 可以直接new实现该接口的类来调用
     *  被static定义的方法:
     *      1. 可以直接在里面写方法体
     *      2. 不可以被实现类重写
     *      3. 可以用接口名调用
     *   抽象方法:不能有方法的具体实现,需要被实现类重写
     */

    void sayDemo1();

    default void runDemo1() {
        System.out.println("runDemo1 in interface");
    }

    default void jumpDemo1() {
        System.out.println("jumpDemo1 in interface");
    }

    static void eatDemo1() {
        System.out.println("eatDemo1 in interface");
    }

    static void drinkDemo1() {
        System.out.println("drinkDemo1 in interface");
    }
}
实现类调用:

新玩意:接口.super.default()方法可以直接调用实现的接口中的default方法

public class TestExtendsDemo1 implements DefaultAndStaticDemo1 {

    @Override
    public void sayDemo1() {
        System.out.println("sayDemo1 in class");
    }

   @Override
    public void jumpDemo1() {
        // 接口.super.default方法可以直接调用接口中的方法,
        DefaultAndStaticDemo1.super.jumpDemo1();
        System.out.println("jumpDemo1 in class");
    }

    /*@Override -->static方法会报错
    public void eatDemo1() {}*/

    public static void main(String args[]) {
        TestExtendsDemo1 testExtendsDemo1 = new TestExtendsDemo1();
        testExtendsDemo1.sayDemo1();
        testExtendsDemo1.jumpDemo1();
        testExtendsDemo1.runDemo1();
        DefaultAndStaticDemo1.eatDemo1();
        // DefaultAndStaticDemo1.super.jumpDemo1(); 这个地方不能使用,会报错,原因还在研究

    }
}
实现类不能实现多个拥有相同default方法的接口

定义一个demo2接口,其中包括和demo1中相同的方法

public interface DefaultAndStaticDemo2 {
    default void runDemo1() {
        System.out.println("runDemo2 in interface");
    }
}

定义一个实现类:

public class TestExtendsDemo2 implements DefaultAndStaticDemo1,DefaultAndStaticDemo2 {
    @Override
    public void sayDemo1() {
        System.out.println("sayDemo1 in class");
    }
}

此时会编译错误:
在这里插入图片描述
可以通过在实现类中重写该方法来解决:

public class TestExtendsDemo2 implements DefaultAndStaticDemo1,DefaultAndStaticDemo2 {
    @Override
    public void sayDemo1() {
        System.out.println("sayDemo1 in class");
    }

    @Override
    public void runDemo1() {

    }
}
抽象类和接口拥有相同方法名的方法的问题

假设一个实现类实现了一个接口继承了一个抽象类,接口中拥有和抽象类中相同名称的default方法,则必须重写该方法
抽象类:

public abstract class AbstractDemo1 {
    abstract void runDemo1();
}

实现类:

public class TestExtendsDemo2 extends AbstractDemo1 implements DefaultAndStaticDemo1 {
    @Override
    public void sayDemo1() {
        System.out.println("sayDemo1 in class");
    }

    @Override
    public void runDemo1() {
        // System.out.println("runDemo1 in class");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值