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 关系。
这里以博客网站举例,比如统计每个月网站前三活跃用户(按用户文章发表量评判),使用集合遍历操作来使用接口默认方法,对于测试数据如下:
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实现,也是java8之前常用的方式。
System.out.println("----------集合遍历-->原始遍历方法---------"); for(UserDto u:uList){ System.out.println(u); }
自定义接口默认方法
/**
*/ 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);
System.out.println("----------集合遍历-->增强的List接口默认方法---------"); uList.forEach(new Consumer<UserDto>() { @Override public void accept(UserDto userDto) { System.out.println(userDto); } }); }
这里以博客网站举例,比如统计每个月网站前三活跃用户(按用户文章发表量评判),使用集合排序操作来使用接口默认方法,对于测试数据如下:
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);
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);
**
**
Java8核心特性-接口默认方法就介绍到这里了,后续小乐会继续讲述Java8核心特性。
小乐开通了公众号:乐字节 欢迎关注
原创所有,转载请注明出处和作者。