乐字节-Java8核心特性实战-接口默认方法
JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本。其中包括语言、编译器、库、工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术开发的趋势。这里主要讲解在开发中几个核心的新特性。(主要从新特性概念解释、语法定义、简单代码演示、优缺点分析、项目实战几个方面编写)。
核心特性一览
图中Java8的这6个核心特性,小乐将会一一阐述,请多关注我 乐字节,转载请注明出处和作者!
接口默认方法
在注册网站时,我们会在注册后使用网站提供的默认头像,应用程序安装成功后通常会提供默认图标,在电商网站购买过商品进行支付时,我们会设置常用收货地址为默认地址,看起来生活中很多场景都有默认一说。Java8 开始,同样也有默认这个词的出现,这里针对接口Java8扩展了接口原有功能,并对默认方法提供支持。
概念
从Java8开始,程序允许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。默认方法在接口中可以添加多个,并且Java8提供了很多对应的接口默认方法。
语法
Java8中接口可以包含实现方法,需要使用default修饰,此类方法称为默认方法。默认方法在接口中必须提供实现,在实现类中可以按需重写。默认方法只能在实现类中或通过实现类对象调用。如下形式:
public interface IMathOperation {
/**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println("数值运算基本接口默认打印方法。。。");
}
}
简单使用
接口定义
定义IMathOperation 接口 并提供默认打印方法
public interface IMathOperation {
/**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println("这是数值运算基本接口。。。");
}
/**
* 整数加法运算方法
* @param a
* @param b
* @return
*/
public int add(int a,int b);
}
子类实现
定义MathOperationImpl子类 实现IMathOperation 接口
子类在实现时,按需重写接口默认方法
public class MathOperationImpl implements IMathOperation {
@Override
public int add(int a, int b) {
// 子类中可以直接调用父类接口默认方法
IMathOperation.super.print();
// 调用父类静态默认方法
IMathOperation.version();
return a+b;
}
}
多个默认方法
使用Java8开发应用程序,子类实现多个接口时,对于接口默认方法定义允许定义多个默认方法,并且接口默认方法可能会出现同名情况,此时对于子类在实现或者调用时通常遵循以下原则:
1.类中的方法优先级最高
2.如果第一条无法进行判断,那么子接口的优先级更高:函数签名相同时,优先选择拥有最具体实现的默认方法的接口,即如果B继承了A,那么B就比A更加具体
示例代码如下:
/**
* 定义手机接口 提供默认info方法
*/
public interface Phone {
default void info(){
System.out.println("这是一部手机");
}
}
/**
* 定义MiPhone子接口 并继承 Phone 父接口 同时也提供info方法
*/
public interface MiPhone extends Phone{
default void info(){
System.out.println("这是一部小米手机");
}
}
/**
* 实现 Phone MiPhone 接口
*/
public class M2sPhone implements Phone,MiPhone {
public static void main(String[] args) {
new M2sPhone().info();
}
}
打印结果:
这是一部小米手机
接口静态方法
接口中除了允许定义多个默认方法之外,Java8也允许在接口中定义多个静态方法,静态方法即通过static 修饰的方法。接口中静态方法也必须提供实现,提供了可以直接通过接口调用方法的方式。
public interface IMathOperation {
/**
* 定义接口默认方法 支持方法形参
*/
default void print(){
System.out.println("这是数值运算基本接口。。。");
}
/**
* 定义静态默认方法
*/
static void version(){
System.out.println("这是1.0版简易计算器");
}
}
接口中的静态方法只能通过接口本身去调用,类似于 Class 中的静态方法,不存在默认方法中的多继承问题,静态方法并不能在实现类中被覆写,实现类中可以声明相同的方法,但这两个方法之间除了名字相同,并没有 Override 关系。
接口默认方法实战
网站活跃TOP3用户遍历
这里以博客网站举例,比如统计每个月网站前三活跃用户(按用户文章发表量评判),使用集合遍历操作来使用接口默认方法,对于测试数据如下:
uList= new ArrayList<>();
uList.add(new UserDto(35,"zs","126xxx@126.com",800,"lv4"));
uList.add(new UserDto(60,"js_li","157xxx@139.com",500,"lv3"));
uList.add(new UserDto(78,"fc_007","126@126.com",260,"lv2"));
增强for实现
得到统计集合数据后,最简单的方式使用增强for实现,也是java8之前常用的方式。
System.out.println("----------集合遍历-->原始遍历方法---------");
for(UserDto u:uList){
System.out.println(u);
}
自定义接口默认方法
/**
* @Version 1.0
* 定义MyList 接口 并提供myForeach 默认方法
*/
public interface MyList<T> {
/**
* 定义接口默认方法
* @param t
*/
default public void myForeach(List<T> t){
for(Object o:t){
System.out.println(o);
}
}
}
/**
* @Version 1.0
* 定义MyArrayList 子类 实现MyList 接口,继承ArrayList
*/
public class MyArrayList<T> extends ArrayList<T> implements MyList<T> {
}
/**
执行遍历
*/
System.out.println("----------集合遍历-->自定义接口默认方法---------");
// 使用自定义的接口默认方法实现集合元素遍历
uList.myForeach(uList);
使用增强的Iterable接口默认方法
System.out.println("----------集合遍历-->增强的List接口默认方法---------");
uList.forEach(new Consumer<UserDto>() {
@Override
public void accept(UserDto userDto) {
System.out.println(userDto);
}
});
}
网站活跃TOP3用户排序
这里以博客网站举例,比如统计每个月网站前三活跃用户(按用户文章发表量评判),使用集合排序操作来使用接口默认方法,对于测试数据如下:
Collections.sort 工具类方法实现排序
System.out.println("--------Collections.sort 实现按文章发表量排序---------");
Collections.sort(uList, new Comparator<UserDto>() {
@Override
public int compare(UserDto o1, UserDto o2) {
return o1.getTotal()-o2.getTotal();
}
});
uList.forEach(System.out::println);
增强的List接口默认sort方法
借助Java8增强的List接口默认Sort方法实现集合排序操作
System.out.println("--------集合默认sort方法实现按文章发表量排序---------");
uList.sort(new Comparator<UserDto>() {
@Override
public int compare(UserDto o1, UserDto o2) {
return o1.getTotal()-o2.getTotal();
}
});
uList.forEach(System.out::println);
Stream流sorted 方法实现排序(这里先做了解!)
Stream流提供了针对集合的多种操作,这里借助Stream的sorted实现集合元素排序操作,后续会对Stream做详细介绍。
System.out.println("--------Stream实现按文章发表量排序---------");
List<UserDto> result= uList.stream().sorted(new Comparator<UserDto>() {
@Override
public int compare(UserDto o1, UserDto o2) {
return o1.getTotal()-o2.getTotal();
}
}).collect(Collectors.toList());
result.forEach(System.out::println);
接口默认方法与静态方法的优势
接口的兼容性得到解决
使用接口编程的好处是,开发是面向抽象而不再是面向具体来编程,使得程序变得很灵活,缺陷是,当需要修改接口时候,此时对应实现该接口的类需要全部修改,举个例子, java 8 之前对于我们常用的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。从Java8开始,引入了接口默认方法,这样的好处也是很明显的,首先解决了Java8以前版本接口兼容性问题,同时对于我们以后的程序开发,也可以在接口子类中直接使用接口默认方法,而不再需要再各个子类中各自实现响应接口方法。
子类在实现接口方法时灵活度更高
子类在实现接口时,可以按需重写,不在向Java8以前接口方法必须全部实现,同时接口默认方法可以在子类中直接进行调用,灵活度比较高。
开发中避免大量工具类创建
接口中引入静态方法,对于原有项目开发中出现大量的工具类大量静态方法的代码便可以迁移到接口中定义与实现,省去大量工具类的创建。
提升了对Lambda表达式的支持
Lambda 是针对只有一个抽象方法的接口来说的,接口中引入接口默认方法与静态方法,在对接口这些方法进行调用时,可以引入Lambda表达式简化了原有代码的书写形式,使得代码变得更加简洁。
关于Java8核心特性之接口默认方法就介绍到这,下回小乐继续接着讲Java8核心特性。小乐开通了公众号了,名字就叫 乐字节,敬请关注!
乐字节-Java8核心特性实战-接口默认方法的更多相关文章
- 乐字节-Java8核心特性实战之Lambda表达式
大家好,小乐又来给大家分享Java8核心特性了,上一篇文章是<乐字节|Java8核心实战-接口默认方法>,这次就来讲Java8核心特征之Lambda表达式. Java8 引入Lambda表 ...
- 乐字节-Java8核心特性实战之函数式接口
什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...
- 乐字节-Java8核心特性实战之Stream(流)
说起流,我们会想起手机 ,电脑组装流水线,物流仓库商品包装流水线等等.如果把手机 ,电脑,包裹看做最终结果的话,那么加工商品前的各种零部件就可以看做数据源,而中间一系列的加工作业操作,就可以看做流的处 ...
- 乐字节Java8核心特性之方法引用
大家好,我是乐字节的小乐,上一次我们说到了Java8核心特性之函数式接口,接下来我们继续了解Java8又一核心特性--方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引 ...
- 乐字节Java8核心特性之Optional类
大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...
- 乐字节-Java8新特性-接口默认方法
总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本.其中包括语言.编译器.库.工具和JVM等诸多方面的新特性. Java8 新特性列表如下: 接 ...
- 乐字节-Java8新特性之Base64和重复注解与类型注解
上一篇小乐给大家说了<乐字节-Java8新特性之Date API>,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解. 一.Base64 在Java 8中,内置 ...
- 乐字节-Java8新特性-接口默认方法之Stream流(下)
接上一篇:<Java8新特性之stream>,下面继续接着讲Stream 5.流的中间操作 常见的流的中间操作,归为以下三大类:筛选和切片流操作.元素映射操作.元素排序操作: 操作 描述 ...
- 乐字节-Java8新特性之方法引用
上一篇小乐介绍了<Java8新特性-函数式接口>,大家可以点击回顾.这篇文章将接着介绍Java8新特性之方法引用. Java8 中引入方法引用新特性,用于简化应用对象方法的调用, 方法引用 ...
随机推荐
- 【Linux】七种文件类型
Linux中的七种文件类型 d 目录文件. l 符号链接(指向另一个文件). s 套接字文件. b 块设备文件,二进制文件. c 字符设备文件. p 命名管道文件. - 普通文件
- openMSP430之io_test
openMSP430: IO functionality test with interupt #include "omsp_system.h" volatile char shi ...
- 微信小程序swiper bindChange重复执行
swiper是微信小程序的一个滑动组件,非常重要.如果只是做简单的轮播图而不进行复杂的逻辑,直接可以使用,甚至不需要知道组件的方法.今天在做一个如下的页面时,快速滑动swiper出现了问题: 控制台打 ...
- matlab学习下拉菜单Pop-Up Menu的基本用法
创建下拉菜单,修改string的属性,tag改为kj1,value值如果是1就显示第一行的sin(x),是几就显示第几行 %可以更改value值var=get(handles.kj1,'value') ...
- Android 性能测试初探(三)
书接上文 Android 性能测试初探(二) 本文接着往下聊,今天主聊 CPU 及 内存 看到这两个名词,做过PC性能测试的就比较熟悉了,同样的性能测试关注点 :) 首先说说内存,移动端关注的是内存消 ...
- Selenium3+python 加载Firefox配置
有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 . 加载浏览器配置,需要用FirefoxProfile(profile_di ...
- 51nod1183 编辑距离【动态规划】
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除 ...
- 排序算法总结(C++)
算法复杂度 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面. 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面. 时间复杂度:对排序数据的总的操作次数.反映 ...
- IE下自定义错误页面不显示的原因
如果一个 404 页面的内容小于 512B,IE 会认为该 404 页面不够友好,在 IE 下将不会成功返回该 404 错误页面
- 解决Chrome在隐身模式下无法播放Flash视频
在地址栏输入: chrome://flags/#prefer-html-over-flash 打开如下界面,并设置成如下所示: 然后点击左下方重启按钮: 参考: http://www.cnblogs. ...