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

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

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

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

首先我们来看下代码

 

复制代码
 1 public interface SourceInterface 
 2 {
 3     int a = 5;
 4     int b = 10;
 5 
 6     public static int add() 
 7     {
 8         return a + b;
 9     }
10 
11     public static void reset() 
12     {
13         // do sth
14     }
15 
16     public default int f1()
17     {
18         return a;
19     }
20 
21     public default void f2()
22     {
23         // do sth
24     }
25 }
26 
27 class learnCode
28 {
29     public void userInterface()
30     {
31         int xx = SourceLearning.add();
32         SourceLearning.reset();
33         SourceLearning instance = new SourceLearning()
34         {
35             @Override
36             public void f2()
37             {
38                 // do sth 、
39             }
40         };
41         instance.f1();
42         instance.f2();
43         //int y=instance.add(); 注意这句会编译错误
44     }
45 }
复制代码

 

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

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

该静态方法作为接口(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )的类方法,可以直接使用。不需要依托某个实现类。

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

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

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

 

引申:

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

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

1 @Override
2 public void f2()
3 {
4     SourceLearning.super.f2();
5 }

 

的形式

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

我认为主要原因如下:

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

1)接口换抽象类,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )抽象类中添加该方法

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

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

posted @   王若伊_恩赐解脱  阅读(7232)  评论(3编辑  收藏  举报
编辑推荐:
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)

点击右上角即可分享
微信分享提示