java 8 接口默认方法
解决问题:在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 接口默认方法的更多相关文章
- Java8新特性之四:接口默认方法和静态方法
在JDK1.8以前,接口(interface)没有提供任何具体的实现,在<JAVA编程思想>中是这样描述的:"interface这个关键字产生了一个完全抽象的类,它根本就没有提供 ...
- 乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
- 乐字节-Java8核心特性实战-接口默认方法
JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术 ...
- JDK8新特性之接口默认方法与静态方法
接口默认方法与静态方法 有这样一些场景,如果一个接口要添加一个方法,那所有的接口实现类都要去实现,而某些实现类根本就不需要实现这个方法也要写一个空实现,所以接口默认方法就是为了解决这个问题. 接口静态 ...
- 常用的函数式接口Function接口和常用的函数式接口Function接口默认方法andThen
常用的函数式接口Function接口 package com.yang.Test.FunctionStudy; import java.util.function.Function; /** * ja ...
- 为什么java的接口的方法是public abstract修饰?为什么属性是public static final 修饰?
为什么java的接口的方法是public abstract修饰? 1.首先要明白接口的定义和作用是什么: 接口定义:接口是一个全部由抽象方法组成的集合,里面都是抽象方法和常量,用interface修 ...
- Java中解决继承和接口默认方法冲突
1)超类优先.如果超类提供了一个具体方法,同名而且有相同参数类型发默认方法会被忽略. 2)接口冲突.如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方 ...
- Java8新特性第2章(接口默认方法)
在Java中一个接口一旦发布就已经被定型,除非我们能够一次性的更新所有该接口的实现,否者在接口的添加新方法将会破坏现有接口的实现.默认方法就是为了解决这一问题的,这样接口在发布之后依然能够继续演化. ...
- Java 8 特性 —— 默认方法和静态方法
Java 8 新增了接口的默认方法.简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法.我们只需在方法名前面加个 default 关键字即可实现默认方法. 为什么要有这个特性?之前的 ...
随机推荐
- python+selenium下载文件——firefox
修改Firefox的相关配置. 1.profile.set_preference('browser.download.folderList',2) 设置成0代表桌面,1代表下载到浏览器默认下载路径:2 ...
- Linux-定时任务-打包与压缩
figure:first-child { margin-top: -20px; } #write ol, #write ul { position: relative; } img { max-wid ...
- Java第三周课程总结&实验报告一
第三周课程总结 1.关于面向对象的一些具体内容,明白了类与对象以及Java的封装性和构造方法以及对对象匿名的相关知识. 2.this关键字,它是表示类的成员属性(变量),使用this构造方法时必须放在 ...
- 安装CentOS7虚拟机
基础环境 Windows 10 VMware Workstation 1.下载CentOS7镜像 https://www.centos.org/download/ 此次安装使用的版本为: CentOS ...
- HTTP/2 最新漏洞,直指 Kubernetes!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 在这个数据.应用横行的时代,漏洞的出现早已屡见不鲜.在尚未造成大面积危害之前,我们该如何做好防御措施?或许从过往经常发生漏洞 ...
- Java 5种单例模式
/*单例模式: 指某个类中只能存在一个对象实例,并且该类中只提供一个取得其对象实例的方法 优点:减少系统性能开销 应用场景:网站的计数器,任务管理器,回收站等*/ //单例模式1 -- 静态内部类 ...
- P1233木棍加工
这个题被算法标签标为DP,但其实可能只是用dp求子序列,,(n方) 给出l与w,只要是l与w同时满足小于一个l与w,那么这个木棍不需要时间,反之需要1.看到这个题,首先想到了二维背包,然后发现没有最大 ...
- zebra代码分析
http://blog.csdn.net/xuyanbo2008/article/details/7439738
- Python生成文本格式的excel\xlwt生成文本格式的excel\Python设置excel单元格格式为文本\Python excel xlwt 文本格式
Python生成文本格式的excel\xlwt生成文本格式的excel\Python设置excel单元格格式为文本\Python excel xlwt 文本格式 解决: xlwt 中设置单元格样式主要 ...
- Scrapy 教程(十)-管道与数据库
Scrapy 框架将爬取的数据通过管道进行处理,即 pipelines.py 文件. 管道处理流程 一.定义 item item 表示的是数据结构,定义了数据包括哪些字段 class TianqiIt ...