2019独角兽企业重金招聘Python工程师标准>>>

Java8 - 接口默认方法

什么是默认方法,为什么要有默认方法

简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。

为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8之前的集合框架没有foreach方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了使接口没有引入与现有的实现不兼容发展。

如以下所示,

public interface Animal {default void eat() {System.out.println("animal eat default method");}
}

声明了一个接口,里面只有一个默认方法。然后写一个具体的类实现这个接口,

public class Dog implements Animal {public void sayHi() {System.out.println("dog");}public static void main(String args[]) {Dog dog = new Dog();dog.eat();}
}

再具体的类里面不是必须重写默认方法,但必须要实现抽象方法。

默认方法的多重继承

如下所示代码,

/*** Created by xinxingegeya on 15/9/18.*/
public interface A {void doSomething();default void hello() {System.out.println("hello world from interface A");}default void foo() {System.out.println("foo from interface A");}
}interface B extends A {default void hello() {System.out.println("hello world from interface B");A.super.hello();this.foo();A.super.foo();}
}class C implements B, A {@Overridepublic void doSomething() {System.out.println("c object need do something");}public static void main(String args[]) {A obj = new C();obj.hello();//调用B的方法obj.doSomething();}
}

打印结果:

hello world from interface B

hello world from interface A

foo from interface A

foo from interface A

c object need do something

obj.hello()调用的是B接口中的默认方法。同时在B接口中的默认方法有调用了父接口中的默认方法。

我们再来看一个例子,思考一下在多重继承中,如果出现了同名的默认方法,如下所示,

/*** Created by xinxingegeya on 15/9/18.*/
public interface D {default void hello() {System.out.println("hello world from D");}
}interface E {default void hello() {System.out.println("hello world from E");}
}class F implements D, E {@Overridepublic void hello() {System.out.println("hello world F class");D.super.hello();E.super.hello();}public static void main(String args[]) {F f = new F();f.hello();}}

我们需要指定调用哪个接口的默认方法如下,

 D.super.hello();E.super.hello();

======END======

转载于:https://my.oschina.net/xinxingegeya/blog/508046

Java8 - 接口默认方法相关推荐

  1. 30分钟入门Java8之默认方法和静态接口方法

    2019独角兽企业重金招聘Python工程师标准>>> 30分钟入门Java8之默认方法和静态接口方法 作者:@JohnTsai 本文为作者原创,转载请注明出处:http://www ...

  2. java8新特性_乐字节-Java8新特性-接口默认方法

    总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...

  3. java8新特性lambda表达式、函数式编程、方法引用和接口默认方法以及内部类访问外部变量

    一提到java是一种什么语言? 大多数人肯定异口同声的说是一门面向对象的语言,这种观点从我们开始学java就已经根深蒂固了,但是学到java8新特性函数式编程的时候,我才知道java并不是纯面向对象的 ...

  4. idea重写接口没有@override_乐字节|Java8核心实战-接口默认方法

    JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术 ...

  5. JAVA移慎_谨慎使用Java8的默认方法

    为什么要谨慎使用Java8的默认方法?本文给出了为什么要慎用Java8默认方法的原因,解释的很详细,感兴趣的朋友可以参考一下 默认方法给JVM的指令集增加了一个非常不错的新特性.使用了默认方法之后,如 ...

  6. Java 8 - Interface Default Method接口默认方法

    Java 8 相比于Java 7 推出了几大特色(features)(接口默认方法)default methods in interface, (接口静态方法)static method in int ...

  7. java接口的默认方法,实现类调用接口默认方法

    概述 Java8带来了一些全新的特性,包括lambda表达式.函数接口.方法引用.流.可选方法.接口中的静态方法和默认方法. 在本文中,我们将深入讨论为什么java8接口新增了默认方法,如何使用默认方 ...

  8. JDK8新特性之接口默认方法与静态方法

    接口默认方法与静态方法 有这样一些场景,如果一个接口要添加一个方法,那所有的接口实现类都要去实现,而某些实现类根本就不需要实现这个方法也要写一个空实现,所以接口默认方法就是为了解决这个问题. 接口静态 ...

  9. jdk8 接口默认方法_JDK 8中方便的新地图默认方法

    jdk8 接口默认方法 Map接口在JDK 8中提供了一些方便的新方法 . 因为我在本文中介绍的Map方法是作为默认方法实现的,所以Map接口的所有现有实现都享有在默认方法中定义的默认行为,而无需任何 ...

最新文章

  1. Linux那些事儿 之 戏说USB(24)设备的生命线(七)
  2. 简化 MongoDB 关联运算
  3. Caffe: Vs13添加CUDA支持
  4. vue error:The template root requires exactly one element.
  5. HttpRequest Get和Post调用其他页面的方法
  6. 在 Flutter 中创建一个动画屏幕
  7. Axure统计图表设计
  8. WARNING:tensorflow:sample_weight modes were coerced from ... to [‘...‘]
  9. 什么是侧翼区(flanking region)和侧翼区单核苷酸多态性(Flanking SNPs)
  10. iOS系统的设备怎么装两个微信?
  11. Idea在启动Debug功能时报错:Unable to open debugger port (127.0.0.1:63985):
  12. 【洛谷P4315】月下毛景树 树链剖分03
  13. java解析HL7协议报文工具 HAPI(SpringBoot版本)
  14. 【帝国CMS】灵动标签SQL调用广告系统里的广告
  15. IDEA封神榜大语言模型二郎神系列Erlangshen-Ubert-110M-Chinese使用
  16. Python与R的区别与联系
  17. 移民真的抢走了美国人的工作吗?
  18. 谷歌浏览器如何彻底关闭右下角弹出的广告弹窗
  19. 计算机学院迎新晚会目的,某学院计算机系迎新晚会策划书.doc
  20. 2021-08-17 WPF控件专题 Canvas 控件详解

热门文章

  1. Android中Context简介(通俗易懂)
  2. MariaDB/MySQL 报错解决:ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  3. oracle存过传参,oracle 存储过程 传参数,如果是希望传参值也被利用起来,存储过程里面虽有IN,但OUT必不可少。...
  4. java-高并发解决方案
  5. python aipspeech_Python调用百度API实现语音识别(二)
  6. 基于 python + WebDriverAgent 的“跳一跳”小程序高分教程
  7. LNMP架构之PHP——MemCache对PHP页面的缓存加速优化
  8. 保研软件学院和计算机学院,西南大学计算机与信息科学学院·软件学院(专业学位)计算机技术保研细则...
  9. linux lnmp yum,yum安装LNMP
  10. ubuntu12.04 mysql 安装_Ubuntu 12.04 安装 配置 访问MySQL