一、introduce interface default method

Introduce default method
Write the default method at interface
The multiply conflict resolve

interface default method/static method

JDK1.8中为什么接口中要引入default方法?比如JDK以前的版本如JDK1.0 List接口:

public interface List<E>{
void add(E e);
}

其他的Commons/Guavaa等第三方实现了JDK的List接口,就要重写add方法。

jdk1.8之后在List等很多接口中都加入了stream()的获取方法:

default Stream<E> stream();

如果stream方法不是default的话,那么这些第三方的实现List的类统统都要加上stream()的实现,改动太大,jdk1.8为了让第三方的这些实现不需要改动,完美兼容,就将stream()等这些方法
设置为default,那些第三方的实现类就不需要做任何改动,就可以使用默认的stream方法,也可以重写它。

二、自己写个简单的含有default方法的interface

package com.cy.java8;

public class DefaultInAction {
public static void main(String[] args) {
A a = () -> 10; System.out.println(a.size()); //10
System.out.println(a.isEmpty());//false } @FunctionalInterface
private interface A{ int size(); default boolean isEmpty(){
return size() == 0;
}
}
}

三、一个类如果实现多个接口,多个接口中含有重复名字的方法,怎么解决冲突?

三大原则:

1.Classes always win:class的优先级是最高的。比如class C重写了hello方法,优先级最高。
2.Otherwise, sub-interface win:if B extends A, B is more specific than A.
3.Finally, if the choice is still ambiguous, 那么你自己就要重写了。C implements A, B 。A和B没有任何关系,那么C必须重写hello方法。

原则1对应的代码例子:

 package com.cy.java8;

 public class DefaultInAction {
public static void main(String[] args) {
B c = new C();
c.hello(); //C.hello
} private interface A{
default void hello(){
System.out.println("A.hello");
}
} private interface B extends A{
@Override
default void hello() {
System.out.println("B.hello");
}
} private static class C implements A, B{
@Override
public void hello() {
System.out.println("C.hello");
}
}
}

原则2对应的代码例子:

 package com.cy.java8;

 public class DefaultInAction {
public static void main(String[] args) {
A c = new C();
c.hello(); //B.hello
} private interface A{
default void hello(){
System.out.println("A.hello");
}
} private interface B extends A{
@Override
default void hello() {
System.out.println("B.hello");
}
} private static class C implements A, B{ }
}

原则3对应的代码例子:

 package com.cy.java8;

 public class DefaultInAction {
public static void main(String[] args) {
C c = new C();
c.hello(); //C.hello
} private interface A{
default void hello(){
System.out.println("A.hello");
}
} private interface B{
default void hello() {
System.out.println("B.hello");
}
} private static class C implements A, B{
@Override
public void hello() {
//A.super.hello();
//B.super.hello();
System.out.println("C.hello");
}
}
}

  

----

Interface default method介绍的更多相关文章

  1. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  2. Application binary interface and method of interfacing binary application program to digital computer

    An application binary interface includes linkage structures for interfacing a binary application pro ...

  3. jvm Classload method介绍

    1,jvm Classload默认几个重要方法介绍 findClass:Finds and loads the class with the specified name from the URL s ...

  4. interface中定义default方法和static方法

    interface的default方法和static方法 接口中可以定义static方法,可通过接口名称.方法名()调用,实现类不能继承static方法: 接口中可以定义default方法,defau ...

  5. java 小记

    1.获取web项目根目录的绝对路径 request.getContextPath()  获取项目名称,如    /BiYeSheJi getServletContext().getRealPath(& ...

  6. Java 8新特性——default方法(defender方法)介绍

    我们都知道在Java语言的接口中只能定义方法名,而不能包含方法的具体实现代码.接口中定义的方法必须在接口的非抽象子类中实现.下面就是关于接口的一个例子: 1 2 3 4 5 6 7 8 9 10 11 ...

  7. 关于java8 interface的default方法

    转自鸟窝 博主写的挺详细,不了解的看一看啊 以前经常谈论的Java对比c++的一个优势是Java中没有多继承的问题. 因为Java中子类只能继承(extends)单个父类, 尽管可以实现(implem ...

  8. Override is not allowed when implementing interface method Bytecode Version Overriding and Hiding Methods

    java - @Override is not allowed when implementing interface method - Stack Overflow https://stackove ...

  9. Getting start with dbus in systemd (01) - Interface, method, path

    Getting start with dbus in systemd (01) 基本概念 几个概念 dbus name: connetion: 如下,第一行,看到的就是 "dbus name ...

随机推荐

  1. zabbix 性能优化

    Zabbix 安装好就放在那不管了,以为不需要调优.直到最近出现了如下一堆告警. 描述下我们的环境 硬件:8核 32G 软件:Centos7.6 Zabbix4.0.Httpd2.4.PHP7.3.M ...

  2. AVAYA_Site_administrator软件简单操作

    AVAYA_Site_administrator软件简单操作 1.配置软件(第一次登录) 点击File>New>Voice System  在弹出对话框随意输入一个名称 下一步,默认选择 ...

  3. SQLServer中跨服务器跨数据库之间的数据操作

    首先必须理解一个概念: select * from sys.servers         (查看系统表,看原来的服务器名) 要想跨域就必须在以上信息中可以检索到! 怎样添加? --创建链接服务器  ...

  4. oracle 清空当前用户所有对象

    BEGIN FOR REC IN (SELECT OBJECT_NAME,OBJECT_TYPE FROM USER_OBJECTS WHERE OBJECT_TYPE='PROCEDURE' OR ...

  5. MyEclipse 2016 反编译插件安装

    下载插件,分享一下下载插件的地址,百度网盘:链接:http://pan.baidu.com/s/1nturiAH 密码:yk73 1.把net.sf.jadclipse_3.3.0.jar拷到D:\P ...

  6. windows server没有这台电脑图标

    rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0

  7. C#基础再学习

    本次观看C#中级教程视频进行对C#一些基础的再度学习,加深印象. 1.对于错误和异常. 错误可能是语法错误也可能是逻辑错误.可以通过断点进行调试. 断点快捷键F9. 异常,通过try catch捕获, ...

  8. 【HDU6635】Nonsense Time

    题目大意:给定一个长度为 N 的序列,开始时所有的位置都不可用,每经过一个时间单位,都会有一个位置被激活.现给定激活顺序的序列,求每次激活之后全局的最长上升子序列的长度,保证数据随机. 题解: 引理: ...

  9. 【洛谷P4552】IncDec Sequence

    题目大意:给定一个长度为 N 的序列,现可以进行若干次区间 +1 或区间 -1 操作,求使得序列所有的值均相同的最小操作数是多少,且最终得到的序列有多少种. 题解: 首先考虑执行区间+和区间-操作,可 ...

  10. myeclipse 工具栏 Run按钮不见了,怎么调出来啊?

    window-->new window,打开新窗口,按钮出现了.关闭老窗口,再关闭新窗口.再次打开MyEclipse,妥妥的了.