java接口有非抽象方法_纳尼,java可以在接口中实现非抽象方法了?

Java8 引入了接口中定义静态方法和默认方法的特性,允许接口直接添加非抽象实例方法。默认方法使用`default`关键字声明,可以作为接口自带的实现,而静态方法则可以直接通过接口调用。当接口间的默认方法冲突时,需要在实现类中重写。这种变化使得接口更像抽象类,提供了向后兼容的方式添加新功能,同时在多接口继承中可能引发方法冲突问题。
摘要由CSDN通过智能技术生成

纳尼,接口中可以定义实例方法了?!

纳尼,接口中还可以定义静态方法了?!

没错,在Java8中新增了很多新的特性,其中就包括可以在接口中添加方法和变量。

首先我们来看下代码

1 public interfaceSourceInterface2 {3 int a = 5;4 int b = 10;5

6 public static intadd()7 {8 return a +b;9 }10

11 public static voidreset()12 {13 //do sth

14 }15

16 public default intf1()17 {18 returna;19 }20

21 public default voidf2()22 {23 //do sth

24 }25 }26

27 classlearnCode28 {29 public voiduserInterface()30 {31 int xx =SourceLearning.add();32 SourceLearning.reset();33 SourceLearning instance = newSourceLearning()34 {35 @Override36 public voidf2()37 {38 //do sth 、

39 }40 };41 instance.f1();42 instance.f2();43 //int y=instance.add(); 注意这句会编译错误

44 }45 }

代码中,我们可以发现以下几点不同:

1、在接口中,可以直接添加静态方法。

2、在接口中,可以直接添加非抽象的实例方法。

在实例方法的申明中,需要增加default关键字修饰,因此这种方法也称为默认方法。他是接口自带的方法。接口被实现后,实例可以直接使用这些默认方法,同时如果对默认方法需要重写时,可以直接重写即可。

这两点新特性相对于java8之前的版本来说,可以说有质的改变。

引申:

可以增加方法的接口,开始变的更像抽象类。Java类在实现了多个拥有默认方法的接口后,从侧面展现的像是实现了多重继承的影子。

注意:如果两个接口的默认方法出现重复申明,则需要在实现方法中重写该方法,否则jvm在执行时,无法确定究竟应该使用哪个接口的同名方法。这应该可以算是本次新引入特性的一个弊端,如果是指定使用的是某个接口中的默认方法时,可以采用

1 @Override2 public voidf2()3 {4 SourceLearning.super.f2();5 }

的形式

那么,java为什么要引入默认方法呢?如果需要往接口中添加方法,直接使用抽象类即可,为什么要破坏已有的约定呢?

我认为主要原因如下:

在面向接口的编程过程中,发现原有的接口中,都需要添加一个相同的方法,那么现在有两种方案:

2)接口中添加该抽象方法,在每一个接口的实现类中,均添加相同的实现方法。

无论选择哪种方法,都需要对已有的代码做出非常大的改动。可是如果使用默认方法,使对接的接口默认就拥有某些功能的实现,则很好的解决了假设的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值