解决问题:在java8 之前的版本,在修改已有的接口的时候,需要修改实现该接口的实现类。

作用:解决接口的修改与现有的实现不兼容的问题。在不影响原有实现类的结构下修改新的功能方法

案例:

首先定义一个接口DefaultMethodInterface,该接口中定义了静态变量/接口方法/无返回值的默认方法/静态的默认方法/,在java8之前的版本是无法定义默认的方法。

package com.ven.java8.defaultmethod.Inteface;

/**
* jva8接口默认方法
* @author xiaowen0623
*
*/
public interface DefaultMethodInterface {
/**
* 接口静态变量
*/
public static final String TYPE="JAVA8"; /**
* 接口静态变量
*/
public static final String ZW="JAVA WEB开发工程师";
/**
* 接口方法
*
* @param userName
*/
public void execute(String userName); /**
* 默认方法
*
* @param userName
*/
default void learn(String userName) {
System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
} /**
* 默认的静态方法
*
* @param userName
* @return
*/
public static String learnStr(String userName) {
String result = userName + " " + "是一名"+ZW;
return result; }; }

编写一个测试类:

package com.ven.java8.defaultmethod.Inteface;

/**
* 测试接口默认方法
*
* @author xiaowen
*
*/
public class TestDefaultMethodInterface {
public static void main(String[] args) {
// 新创建一个接口实例
DefaultMethodInterface defaul = new DefaultMethodInterface() {
@Override
public void execute(String userName) {
System.out.println(userName + "正在漫漫搬运代码......");
} };
// 调用接口的默认方法
defaul.learn("xiaowen");
// 调用接口方法
defaul.execute("xiaowen");
// 调用接口的静态方法
String result = DefaultMethodInterface.learnStr("xiaowen");
System.out.println(result);
}
}

控制台打印信息:

xiaowen正在学习JAVA8。。。。。。
xiaowen正在漫漫搬运代码......
xiaowen 是一名JAVA WEB开发工程师

总结:

java8的默认接口方法在不破坏java现有实现架构的情况下能往接口里增加新方法。

java 8抽象类和接口的区别:

相同点:

Ø  都是抽象类型

Ø  都可以有实现方法(在java8之前是不可以的)

Ø  都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)

不同点:

Ø  抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);

Ø  抽象类和接口所反映出的设计理念不同。其实抽象类表示的是”is-a”关系,接口表示的是”like-a”关系;

Ø  接口中定义的变量默认是publicstatic final 型,且必须给其初值,所以实现类中不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

想一个问题,如果在A接口和B接口中都定义了相同名称的默认方法,实现类C同时实现这两个接口,会出现怎样的情况呢?

定义接口DefaultMethodInterface

package com.ven.java8.defaultmethod.Inteface;

/**
* jva8接口默认方法
* @author xiaowen0623
*
*/
public interface DefaultMethodInterface {
/**
* 接口静态变量
*/
public static final String TYPE="JAVA8"; /**
* 接口静态变量
*/
public static final String ZW="JAVA WEB开发工程师";
/**
* 接口方法
*
* @param userName
*/
public void execute(String userName); /**
* 默认方法
*
* @param userName
*/
default void learn(String userName) {
System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
} /**
* 默认的静态方法
*
* @param userName
* @return
*/
public static String learnStr(String userName) {
String result = userName + " " + "是一名"+ZW;
return result; }; }

定义接口DefaultMethodInterfaceB

package com.ven.java8.defaultmethod.Inteface;

/**
* jva8接口默认方法
* @author xiaowen0623
*
*/
public interface DefaultMethodInterfaceB {
/**
* 接口静态变量
*/
public static final String TYPE="SPRING"; /**
* 接口静态变量
*/
public static final String ZW="JAVA 服务器端开发工程师";
/**
* 接口方法
*
* @param userName
*/
public void execute(String userName); /**
* 默认方法
*
* @param userName
*/
default void learn(String userName) {
System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
} /**
* 默认的静态方法
*
* @param userName
* @return
*/
public static String learnStr(String userName) {
String result = userName + " " + "是一名"+ZW;
return result; }; }

实现类DefaultMethodImpl

package com.ven.java8.defaultmethod.Inteface;
/**
* 默认方法接口实现类
* @author xiaowen
*
*/
public class DefaultMethodImpl implements DefaultMethodInterface,DefaultMethodInterfaceB{ @Override
public void learn(String userName) {
DefaultMethodInterfaceB.super.learn(userName);
} @Override
public void execute(String userName) { } }

可见该实现类重写了默认方法learn(String userName),调用指定的接口默认方法,可以由实际改变。

如果是实现DefaultMethodImpl实现其中的一个接口,比如:DefaultMethodInterface,默认可以不需要重写默认方法,

package com.ven.java8.defaultmethod.Inteface;
/**
* 默认方法接口实现类
* @author xiaowen
*
*/
public class DefaultMethodImpl implements DefaultMethodInterface{ @Override
public void execute(String userName) { } }

重写默认方法

package com.ven.java8.defaultmethod.Inteface;

/**
* 默认方法接口实现类
* @author xiaowen
*
*/
public class DefaultMethodImpl implements DefaultMethodInterface{ @Override
public void learn(String userName) {
System.out.println("呵呵");
} @Override
public void execute(String userName) { } }

测试:

package com.ven.java8.defaultmethod.Inteface;
/**
* 测试
* @author xiaowen
*
*/
public class TestImpl {
public static void main(String[] args) {
DefaultMethodInterface d = new DefaultMethodImpl();
d.learn("xiaowen");
}
}

java 8 接口默认方法的更多相关文章

  1. Java8新特性之四:接口默认方法和静态方法

    在JDK1.8以前,接口(interface)没有提供任何具体的实现,在<JAVA编程思想>中是这样描述的:"interface这个关键字产生了一个完全抽象的类,它根本就没有提供 ...

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

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

  3. 乐字节-Java8核心特性实战-接口默认方法

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

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

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

  5. 常用的函数式接口Function接口和常用的函数式接口Function接口默认方法andThen

    常用的函数式接口Function接口 package com.yang.Test.FunctionStudy; import java.util.function.Function; /** * ja ...

  6. 为什么java的接口的方法是public abstract修饰?为什么属性是public static final 修饰?

     为什么java的接口的方法是public abstract修饰? 1.首先要明白接口的定义和作用是什么: 接口定义:接口是一个全部由抽象方法组成的集合,里面都是抽象方法和常量,用interface修 ...

  7. Java中解决继承和接口默认方法冲突

    1)超类优先.如果超类提供了一个具体方法,同名而且有相同参数类型发默认方法会被忽略. 2)接口冲突.如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方 ...

  8. Java8新特性第2章(接口默认方法)

    在Java中一个接口一旦发布就已经被定型,除非我们能够一次性的更新所有该接口的实现,否者在接口的添加新方法将会破坏现有接口的实现.默认方法就是为了解决这一问题的,这样接口在发布之后依然能够继续演化. ...

  9. Java 8 特性 —— 默认方法和静态方法

    Java 8 新增了接口的默认方法.简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法.我们只需在方法名前面加个 default 关键字即可实现默认方法. 为什么要有这个特性?之前的 ...

随机推荐

  1. NFS服务和DHCP服务讲解

    1.NFS服务端概述 NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS: NFS允许一个系统在网络上与他人共享 ...

  2. Java——HashMap源码解析

    以下针对JDK 1.8版本中的HashMap进行分析. 概述     哈希表基于Map接口的实现.此实现提供了所有可选的映射操作,并且允许键为null,值也为null.HashMap 除了不支持同步操 ...

  3. API接口设计

    1.场景描述 比如说我们要做一款APP,需要通过api接口给app提供数据.假设我们是做商城,比如我们卖书的.我们可以想象下这个APP大概有哪些内容: 1)首页:banner区域(可以是一些热门书籍的 ...

  4. 极*Java速成教程 - (8)

    Java高级特性 注解 注解可以在代码之外添加更多的信息,更加完整地描述程序,帮助编译器进行工作,或者实现某些特定的Java代码之外的功能. 注解可以简化某些重复的流程,自动化那些过程. 注解的使用 ...

  5. P1190排队接水

    这是2010年普及组第二题(话说我怎么只做普及组的题?因为太蒻). 这道题可以用搜索或者模拟来做,果断编了几组例子去分析来模拟,利用了贪心的思想得出:每次比较每个水龙头的空闲时间点,谁早就放到谁那里, ...

  6. Python 入门之 推导式

    Python 入门之 推导式 推导式就是构建比较有规律的列表,生成器,字典等一种简便的方式 1.推导式 (1)列表推导式 : <1> 普通循环: [变量 for循环] print([i f ...

  7. SCUT - 482 - 生成树上的点 - Prufer

    https://scut.online/p/482 没听说过这个东西. 洛谷也有这个,所以还是要去接触一些奇奇怪怪的知识才行. https://www.luogu.org/problem/P2290 ...

  8. 通过编写串口助手工具学习MFC过程——(二)通过“打开串口”按钮了解基本操作

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  9. HDU1688-POJ3463-Sightseeing(求次短路的条数)

    题意 求出最短路和次短路的条数,当次短路比最短路长度小1时,输出条数之和,反之输出最短路条数. 题解  dis1[],cnt1[],dis2[],cnt2[] 分别表示最短路的长度和条数,次短路的长度 ...

  10. 【C#】获取"我的电脑"的名字,如This PC、这台计算机

    原文:[C#]获取"我的电脑"的名字,如This PC.这台计算机 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接: ...