关于接口,每天的编码都在写,就不多说了。这里对比下接口,抽象类,类3者的关系:
1),接口是一种规范,就是告诉外界这个东东可以做什么。
2),抽象类是一种模板,就是告诉外界这个东西的一部分公共功能。
3),类和上面的接口,抽象类最大的区别就是类可以维护状态信息。

  • 在以前的接口中

1,没有构造方法,不能实例化
2,接口只能继承接口,不能继承类
3,接口里没有普通方法,方法全是抽象的
4,接口里的方法默认修饰符是public abstract
5,接口里的字段全是全局常量,默认修饰符是public static final

java8中的接口在原来的基础上增加了一些功能,主要是2个:默认方法,静态方法。

  • 1,默认方法

首先来了解下为什么会出现默认方法这个东西。许多开发语言都将函数表达式集成到了其集合库中,这样子比循环方式所需的代码更少,并且更加容易理解。比如以前我们写循环代码:

for(int i = 0; i<list.size();i++)
{System.out.println(list.get(i));
}

现在我们使用函数函数式编程,代码如下:

public static void main(String[] args){List<Integer> list = Lists.newArrayList(1, 2, 3);Stream<Integer> stream = list.stream();stream.forEach(System.out::println);}

现在假设我们自己不用流,我们想直接在list集合上面提供一个forEach方法,用来将一个函数应用到集合的每一个元素上面。下面是使用这种方式编写的代码:

list.forEach(System.out::println);

上面的效果很好,如果我们自己定义也就是说重新设计集合当然是没有问题的,但是java的集合是许多年前设计的,这就会带来一个问题,我们为List接口增加了一个方法,那么所有的实现类都要改过,这样子代码才不会报错,这基本是无法想象的。所以呢,java设计者希望通过允许接口包含具体实现的方法来一劳永逸的解决这个问题。当然,为接口提供默认方法还有别的好处,我们一会会整理到。
java8中允许在接口中定义默认方法,默认方法必须使用default来修饰。先来看一个例子,熟悉下java8中默认方法的语法:

public class Test implements TestInterface
{public static void main(String[] args){Test test = new Test();//使用自己类中的方法System.out.println(test.getId());//使用接口中的默认方法System.out.println(test.getName());}@Overridepublic Integer getId(){return 25;}}interface TestInterface
{Integer getId();default String getName(){return "默认方法里面的输出。。。";}
}

上面的代码使用了TestInterface接口中定义的默认方法getName(),程序执行没一点问题。当然我们也可以自己来重写接口中默认方法中的默认方法。

public class Test implements TestInterface
{public static void main(String[] args){Test test = new Test();//使用自己类中的方法System.out.println(test.getId());//使用接口中的默认方法System.out.println(test.getName());}@Overridepublic Integer getId(){return 25;}@Overridepublic String getName(){//默认使用接口中的默认方法,注意下面的使用父类接口中方法的语法//return TestInterface.super.getName();return "自己的类中重写了接口中的默认方法";}}interface TestInterface
{Integer getId();default String getName(){return "默认方法里面的输出。。。";}
}

在上面的使用过程中,我们发现了现在使用java8接口的默认方法很好的解决了前面我说的问题了,我们不必在每个实现类中都去实现接口中新加的方法了,只需要在接口中增加一个default修饰的默认方法就好了。

另外,在上面的编码过程中,我们不难还能发现一个使用默认方法带来的好处,我们现在可以很方便的在接口中指定本质上可选的方法,根据接口的使用方式来选择使用的方法。举个例子吧,比如我们定义了一个接口,里面有一个删除元素的方法remove(),但是实际情况是这个接口应该支持可修改和不可修改2种系列,在可修改系列中没有问题,我们直接实现remove()方法就好了,不可修改系列我们不需要这个方法,但是也只能定义一个remove()的空实现,最好抛出一个异常。现在我们使用java8中的默认方法,就避免了用于不可修改系列的类也必须定义自己的,占位符性质的多余的方法,总结一下就是说默认方法让一些类要去实现的方法变成了可选方法。

  • 总结一下:

默认方法提供了2个优点:
1,优雅的随时间演化接口。也就是代码的向后兼容性
2,提供可选功能,类不必在不需要该功能的时候提供占位符实现。

  • 2,多级继承的问题

java中的继承是单继承,这个不多说了。现在考虑到接口新增的默认方法,现在java是不是绕开了单继承呢?明显不是。接口不能维护状态信息,但是现在默认方法可以提供一些行为上面的多继承。比如说一个类实现2个接口,在这2个接口中定义了2个默认方法,那么这个类同时拿到了2个方法,编码确实多了很大的灵活性。但是也会有一个很明确也是必须要解决的问题,就是冲突问题,比如说A类实现了B接口,C接口,如果B和C接口都提供了一个叫test的默认方法,那A类将实现那个接口里面的test方法呢?又比如说A类提供了自己的实现,这时候将发生什么?又比如说A同时也继承了一个有test方法的类,那么这个时候有事什么情况呢?

不慌的,解决上面的问题很简单,就是定义一组规则就好了,按照一个约定来定义解决上面的冲突。具体的规则如下:
1),在所有的情况,类实现的优先级高于接口的默认实现,也就是先使用自己类中定义的方法或者是父类中的方法。类优先是解决上面系列问题的最主要的规则。
2),当类同时实现了2个接口,2个接口中如果包含相同的默认方法,那么这个类中就必须重写这个接口,不然代码报错。
3),如果是一个接口继承了另外一个接口,2个接口中也包含相同的默认方法,那么继承接口的版本具有更高的优先级。比如A扩展了B接口,那么优先使用A类里面的test方法。
4),通过使用super,可以显式的引用被继承接口的默认实现,语法如下:InterfaceName.super.methodName()。
相关代码如下:

public class Test extends C
{public static void main(String[] args){Test test = new Test();System.out.println(test.getName());}}class C implements A, B
{@Overridepublic Integer getId(){// TODO Auto-generated method stubreturn null;}//不管接口A和接口B中的这个方法是不是默认方法,有没有提供实现都必须重写, 不然代码报错@Overridepublic String getName(){System.out.println(A.super.getName());return "自己类中必须重写这个方法。。。";}}interface A
{Integer getId();default String getName(){return "接口A。。。";}
}interface B
{default String getName(){return "接口B。。。";}}
  • 3,在接口中使用静态方法

在java8中为接口新增了一项功能,定义一个或者更多个静态方法。类似于类中的静态方法,接口定义的静态方法可以独立于任何对象调用。所以,在调用静态方法时,不需要实现接口,也不需要接口的实例,也就是说哦和调用类的静态方法的方式类似。语法如下:
接口名字.静态方法名。

public class Test implements A
{public static void main(String[] args){System.out.println(A.getName());}}interface A
{static String getName(){return "接口A。。。";}
}

注意,实现接口的类或者子接口不会继承接口中的静态方法。static不能和default同时使用。在java8中很多接口中都增加了静态方法,比如下面代码:

public class Test
{public static void test(List<String> list){//直接使用Comparator的静态方法list.sort(Comparator.comparing(String::length));}public static void main(String[] args){List<String> list = Lists.newArrayList("122","2","32");test(list);for (String str : list){System.out.println(str);}}}

转载于:https://www.cnblogs.com/LinkinPark/p/5232972.html

java1.8--改进的接口相关推荐

  1. java9新特性--jShell--命令语法改进:try语和接口的私有方法--String存储结构变更--集合工厂方法--模块化系统--InputStream 加强--增强的 Stream API

    目录 Java 9 的新特性 JDK 和 JRE 目录结构的改变 模块化系统: Jigsaw -> Modularity 实现目标 模块 结构 jShell命令 产生背景 设计理念 实现目标 j ...

  2. java 内部类声明 抽象类_Java 抽象类、接口、内部类

    抽象类 当编写一个类时,常常会为该类定义一些方法,这些方法用以描述该类的行为方式,那么这些方法都有具体的方法体.但在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确地知道这些子类如何实 ...

  3. JAVA抽象类接口初始化块实验_抽象类和接口 - 逝水无痕7777的个人空间 - OSCHINA - 中文开源技术交流社区...

    抽象类和接口 1.抽象类 抽象方法是只有方法签名,没有方法实现的方法.有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法.抽象方法和抽象类必须使用abstract修饰符来定义. 抽象类不能被实例 ...

  4. 我要翻译《Think Python》- 006 第四章 学习案例:接口设计

    本文翻自:Allen B. Downey --<Think Python> 原文链接:http://www.greenteapress.com/thinkpython/html/think ...

  5. 【掌握接口开发技巧 打造可靠的API接口】按关键字搜索商品

    作为一名程序员,在开发过程中经常需要开发API接口来实现数据的传输和交互等功能.本文将介绍程序员如何开发API接口,并提供一些实用的技巧. 第一步: 设计接口文档 在开发API之前,我们需要先设计接口 ...

  6. USB-C接口iPhone再出续集,小哥改良换接口工艺增加防水功能,还打算筹钱量产...

    行早 发自 凹非寺 量子位 | 公众号 QbitAI 还记得把苹果的闪电接口改成USB-C接口,还拍卖出86001美元高价的那个项目吗? 这位名叫Kenn Pillonel的小哥,之前还表示想要继续改 ...

  7. 疯狂JAVA讲义学习——基础代码练习——Interface——接口

    Java 接口 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并 ...

  8. MXNet 0.11发布,加入动态图接口Gluon,还有两位CMU教授的亲笔教程

    经过3个月的开发,MXNet 0.11版发布啦!0.11是MXNet正式加入Apache以后的第一个版本,官方网站搬到了Apache的服务器(注意:要在最上方Version处选择master才能看到包 ...

  9. 它,是一部全网最全的JDK发展历史轨迹图...

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:Byte_Liu   来源:http://byteliu.c ...

最新文章

  1. Introduction to Django(The Definitive Guild to Django)
  2. Nginx之rewrite简述
  3. 从user 登陆開始
  4. python—web页面操作之3种等待方式
  5. Java操作HBase 2.0.5:创建表代码示例
  6. iOS13后添加SceneDelegate初始化window
  7. 靠谱测试人员需具备解决问题能力
  8. 使用surface初体验
  9. Latex英文论文模板汇总(elsevier、arXiv、IEEE Access)
  10. iperf 的下载和使用
  11. python修改系统环境变量_Python实战—修改环境变量
  12. 超简单直观理解懒加载(Lazyload)
  13. 第十二周项目四----利用遍历思想求解图问题之6最短路径
  14. 能满足各种应用场景的数据可视化大屏
  15. 上网行为安全之管理部署模式及trunk部署
  16. 京东的商品搜索功能是如何实现的_「商品架构day8」京东几百亿的商品怎么搜索...
  17. 7、KNN(K近邻)
  18. java新闻管理系统代码下载_通用新闻管理系统
  19. 【ESWIN编程大赛】五、2020年11月12日陈工直播笔记
  20. IDEA下的Java编程

热门文章

  1. Sring AOP(简记)
  2. Nginx upstream 配置
  3. 函数⑥作用域与命名空间
  4. 内存查看工具RAMMAP说明
  5. Ajax拖放页面元素(图片)
  6. jmeter中timeout值怎么设置_jMeter解决failed to respond Connection reset
  7. 全国计算机等级考试题库二级C操作题100套(第62套)
  8. 全国计算机等级考试题库二级C操作题100套(第44套)
  9. 全国计算机等级考试题库二级C操作题100套(第33套)
  10. php 正则替换style,php正则去除js,class,id,style标签代码