资讯专栏INFORMATION COLUMN

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

lbool / 2625人阅读

摘要:语法中接口可以包含实现方法,需要使用修饰,此类方法称为默认方法。核心特性接口默认方法就介绍到这里了,后续小乐会继续讲述核心特性。

JAVA8已经发布很久,是自java5(2004年发布)之后Oracle发布的最重要的一个版本。其中包括语言、编译器、库、工具和JVM等诸多方面的新特性,对于国内外互联网公司来说,Java8是以后技术开发的趋势。这里主要讲解在开发中几个核心的新特性。(主要从新特性概念解释、语法定义、简单代码演示、优缺点分析、项目实战几个方面编写)。

**

一、核心特性一览

**

上图就是Java8的6个核心特性,小乐将会一一给大家阐述,请关注乐字节哦!

**

二、接口默认方法

**

在注册网站时,我们会在注册后使用网站提供的默认头像,应用程序安装成功后通常会提供默认图标,在电商网站购买过商品进行支付时,我们会设置常用收货地址为默认地址,看起来生活中很多场景都有默认一说。Java8 开始,同样也有默认这个词的出现,这里针对接口Java8扩展了接口原有功能,并对默认方法提供支持。

1、概念

从Java8开始,程序允许在接口中包含带有具体实现的方法,使用default修饰,这类方法就是默认方法。默认方法在接口中可以添加多个,并且Java8提供了很多对应的接口默认方法。

2、语法

Java8中接口可以包含实现方法,需要使用default修饰,此类方法称为默认方法。默认方法在接口中必须提供实现,在实现类中可以按需重写。默认方法只能在实现类中或通过实现类对象调用。如下形式:

public interface IMathOperation {
    /**
     * 定义接口默认方法 支持方法形参
     */
    default void print(){
        System.out.println("数值运算基本接口默认打印方法。。。");
    }
}
3、简单使用

接口定义
定义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;
    }
}

4、多个默认方法
使用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 关系。

四、接口默认方法实战 1、网站活跃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 {
    /**
     * 定义接口默认方法
     * @param t
     */
   default public  void myForeach(List t){
       for(Object o:t){
           System.out.println(o);
       }
   }
}

/**
 * @Version 1.0
 * 定义MyArrayList 子类  实现MyList 接口,继承ArrayList
 */
public class MyArrayList extends ArrayList implements   MyList {
    
}

/**
  执行遍历
*/
System.out.println("----------集合遍历-->自定义接口默认方法---------");
// 使用自定义的接口默认方法实现集合元素遍历
uList.myForeach(uList);

使用增强的Iterable接口默认方法

System.out.println("----------集合遍历-->增强的List接口默认方法---------");
uList.forEach(new Consumer() {
@Override
public void accept(UserDto userDto) {
    System.out.println(userDto);
        }
    });
}    
2、网站活跃TOP3用户排序

这里以博客网站举例,比如统计每个月网站前三活跃用户(按用户文章发表量评判),使用集合排序操作来使用接口默认方法,对于测试数据如下:

Collections.sort 工具类方法实现排序

System.out.println("--------Collections.sort 实现按文章发表量排序---------");

      Collections.sort(uList, new Comparator() {
          @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() {
            @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 result= uList.stream().sorted(new Comparator() {
            @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核心特性。
小乐开通了公众号:乐字节 欢迎关注

原创所有,转载请注明出处和作者。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74719.html

相关文章

  • 字节-Java8核心特性实战之函数式接口

    摘要:大家好,上一篇小乐给大家讲述了乐字节核心特性表达式,点击回顾。接下来继续核心特性之函数式接口。感谢大家欣赏小乐带来的核心特性之函数式接口,接下来还会更多核心技术讲解,请关注乐字节如需要视频课程,请搜索乐字节腾讯课堂 大家好,上一篇小乐给大家讲述了《乐字节-Java8核心特性-Lambda表达式》,点击回顾。接下来继续:Java8核心特性之函数式接口。 什么时候可以使用Lambda?通常...

    niceforbear 评论0 收藏0
  • 字节Java8核心特性实战方法引用

    摘要:大家好,我是乐字节的小乐,上一次我们说到了核心特性之函数式接口,接下来我们继续了解又一核心特性方法引用。方法引用是一种更简洁易懂的表达式。感谢光临阅读小乐的,敬请关注乐字节后续将继续讲述等前沿知识技术。 大家好,我是乐字节的小乐,上一次我们说到了Java8核心特性之函数式接口,接下来我们继续了解Java8又一核心特性——方法引用。 showImg(https://segmentfaul...

    lakeside 评论0 收藏0
  • 字节-Java8核心特性实战之Lambda表达式

    摘要:使用表达式,使得应用变得简洁而紧凑。很多语言等从设计之初就支持表达式。表达式的参数与函数式接口内方法的参数,返回值类型相互对应。更多教程和资料请上腾讯课堂乐字节 showImg(https://segmentfault.com/img/bVbtotg?w=935&h=345); Java8 引入Lambda表达式,允许开发者将函数当成参数传递给某个方法,或者把代码本身当作数据进行处理。...

    Karuru 评论0 收藏0
  • 字节-Java8核心特性实战之Stream(流)

    摘要:大家好,我是乐字节的小乐。需要注意的是很多流操作本身就会返回一个流,所以多个操作可以直接连接起来,如下图这样,操作可以进行链式调用,并且并行流还可以实现数据流并行处理操作。为集合创建并行流。 大家好,我是乐字节的小乐。说起流,我们会联想到手机、电脑组装流水线,物流仓库商品包装流水线等等,如果把手机 ,电脑,包裹看做最终结果的话,那么加工商品前的各种零部件就可以看做数据源,而中间一系列的...

    wenshi11019 评论0 收藏0
  • 字节-Java8特性-接口默认方法

    摘要:注意当多个父接口中存在相同的默认方法时,子类中以就近原则继承。定义静态默认方法这是版简易计算器接口默认方法使用定义接口并提供默认打印方法定义接口默认方法支持方法形参这是数值运算基本接口。。。 总概 JAVA8 已经发布很久,而且毫无疑问,java8是自java5(2004年发布)之后的最重要的版本。其中包括语言、编译器、库、工具和JVM等诸多方面的新特性。 Java8 新特性列表如下:...

    arashicage 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<