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

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

案例:

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

  1. package com.ven.java8.defaultmethod.Inteface;
  2. /**
  3. * jva8接口默认方法
  4. * @author xiaowen0623
  5. *
  6. */
  7. public interface DefaultMethodInterface {
  8. /**
  9. * 接口静态变量
  10. */
  11. public static final String TYPE="JAVA8";
  12. /**
  13. * 接口静态变量
  14. */
  15. public static final String ZW="JAVA WEB开发工程师";
  16. /**
  17. * 接口方法
  18. *
  19. * @param userName
  20. */
  21. public void execute(String userName);
  22. /**
  23. * 默认方法
  24. *
  25. * @param userName
  26. */
  27. default void learn(String userName) {
  28. System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
  29. }
  30. /**
  31. * 默认的静态方法
  32. *
  33. * @param userName
  34. * @return
  35. */
  36. public static String learnStr(String userName) {
  37. String result = userName + " " + "是一名"+ZW;
  38. return result;
  39. };
  40. }

编写一个测试类:

  1. package com.ven.java8.defaultmethod.Inteface;
  2. /**
  3. * 测试接口默认方法
  4. *
  5. * @author xiaowen
  6. *
  7. */
  8. public class TestDefaultMethodInterface {
  9. public static void main(String[] args) {
  10. // 新创建一个接口实例
  11. DefaultMethodInterface defaul = new DefaultMethodInterface() {
  12. @Override
  13. public void execute(String userName) {
  14. System.out.println(userName + "正在漫漫搬运代码......");
  15. }
  16. };
  17. // 调用接口的默认方法
  18. defaul.learn("xiaowen");
  19. // 调用接口方法
  20. defaul.execute("xiaowen");
  21. // 调用接口的静态方法
  22. String result = DefaultMethodInterface.learnStr("xiaowen");
  23. System.out.println(result);
  24. }
  25. }

控制台打印信息:

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

总结:

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

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

相同点:

Ø  都是抽象类型

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

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

不同点:

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

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

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

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

定义接口DefaultMethodInterface

  1. package com.ven.java8.defaultmethod.Inteface;
  2. /**
  3. * jva8接口默认方法
  4. * @author xiaowen0623
  5. *
  6. */
  7. public interface DefaultMethodInterface {
  8. /**
  9. * 接口静态变量
  10. */
  11. public static final String TYPE="JAVA8";
  12. /**
  13. * 接口静态变量
  14. */
  15. public static final String ZW="JAVA WEB开发工程师";
  16. /**
  17. * 接口方法
  18. *
  19. * @param userName
  20. */
  21. public void execute(String userName);
  22. /**
  23. * 默认方法
  24. *
  25. * @param userName
  26. */
  27. default void learn(String userName) {
  28. System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
  29. }
  30. /**
  31. * 默认的静态方法
  32. *
  33. * @param userName
  34. * @return
  35. */
  36. public static String learnStr(String userName) {
  37. String result = userName + " " + "是一名"+ZW;
  38. return result;
  39. };
  40. }

定义接口DefaultMethodInterfaceB

  1. package com.ven.java8.defaultmethod.Inteface;
  2. /**
  3. * jva8接口默认方法
  4. * @author xiaowen0623
  5. *
  6. */
  7. public interface DefaultMethodInterfaceB {
  8. /**
  9. * 接口静态变量
  10. */
  11. public static final String TYPE="SPRING";
  12. /**
  13. * 接口静态变量
  14. */
  15. public static final String ZW="JAVA 服务器端开发工程师";
  16. /**
  17. * 接口方法
  18. *
  19. * @param userName
  20. */
  21. public void execute(String userName);
  22. /**
  23. * 默认方法
  24. *
  25. * @param userName
  26. */
  27. default void learn(String userName) {
  28. System.out.println(userName + "正在学习"+TYPE+"。。。。。。");
  29. }
  30. /**
  31. * 默认的静态方法
  32. *
  33. * @param userName
  34. * @return
  35. */
  36. public static String learnStr(String userName) {
  37. String result = userName + " " + "是一名"+ZW;
  38. return result;
  39. };
  40. }

实现类DefaultMethodImpl

  1. package com.ven.java8.defaultmethod.Inteface;
  2. /**
  3. * 默认方法接口实现类
  4. * @author xiaowen
  5. *
  6. */
  7. public class DefaultMethodImpl implements DefaultMethodInterface,DefaultMethodInterfaceB{
  8. @Override
  9. public void learn(String userName) {
  10. DefaultMethodInterfaceB.super.learn(userName);
  11. }
  12. @Override
  13. public void execute(String userName) {
  14. }
  15. }

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

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

  1. package com.ven.java8.defaultmethod.Inteface;
  2. /**
  3. * 默认方法接口实现类
  4. * @author xiaowen
  5. *
  6. */
  7. public class DefaultMethodImpl implements DefaultMethodInterface{
  8. @Override
  9. public void execute(String userName) {
  10. }
  11. }

重写默认方法

package com.ven.java8.defaultmethod.Inteface;

  1. /**
  2. * 默认方法接口实现类
  3. * @author xiaowen
  4. *
  5. */
  6. public class DefaultMethodImpl implements DefaultMethodInterface{
  7. @Override
  8. public void learn(String userName) {
  9. System.out.println("呵呵");
  10. }
  11. @Override
  12. public void execute(String userName) {
  13. }
  14. }

测试:

  1. package com.ven.java8.defaultmethod.Inteface;
  2. /**
  3. * 测试
  4. * @author xiaowen
  5. *
  6. */
  7. public class TestImpl {
  8. public static void main(String[] args) {
  9. DefaultMethodInterface d = new DefaultMethodImpl();
  10. d.learn("xiaowen");
  11. }
  12. }

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. 一个很有意思的小游戏:Dig2China

    最近通关了一个小游戏,游戏故事是这样的:一个美国小男孩想要去中国,他决定从自家后院往下挖,横穿地心去中国,期间经历了很多次失败.但是,每次尝试都能收获一批钱,用这些钱升级钻地机,调整自己的工具,终于在 ...

  2. Android专项测试监控资源

    版本号 V 1.1.0 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试(本次主要关注点为app的性能测试) Android的app性能测试包括的测 ...

  3. 深入理解java:1.3.2 JVM监控与调优

    学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之. 本篇,来看看[ 如何监控和优化GC机制.] 通过学习,我觉得JVM监控与调优,主要在3个着眼点上: 1,如何配置 ...

  4. 四、Zabbix-zabbix agent部署

    1.添加zabbix安装源 rpm -i http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-release-3.4-2.el7.noarch ...

  5. [集合]Map

      Map集合的功能概述 a:添加功能 * V put(K key,V value):添加元素.* 如果键是第一次存储,就直接存储元素,返回null * 如果键不是第一次存在,就用值把以前的值替换掉, ...

  6. sudo pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple ipython

    sudo pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple ipython

  7. Python 矩阵(线性代数)

    Python 矩阵(线性代数) 这里有一份新手友好的线性代数笔记,是和深度学习花书配套,还被Ian Goodfellow老师翻了牌. 笔记来自巴黎高等师范学院的博士生Hadrien Jean,是针对& ...

  8. nodejs版实现properties后缀文件解析

    1.propertiesParser.js let readline = require('readline'); let fs = require('fs'); // properties文件路径 ...

  9. P2586 [ZJOI2008]杀蚂蚁

    传送门 快乐模拟,修身养性 代码长度其实还好,主要是细节多 只要知道一些计算几何基础知识即可快乐模拟,按着题目要求一步步实现就行啦 注意仔细读题,蚂蚁每 $5$ 秒乱走一次的时候是只要能走就走了,不一 ...

  10. PHP curl拓展的介绍和使用

    curl_setopt($ch, CURLOPT_URL, 'http://www.baidu.com/');//请求url地址curl_setopt($ch, CURLOPT_HEADER, 0); ...