Java8 default方法

为什么需要引入default方法

  在Java7以前interface只能声明方法,而不能实现方法。

  在Java8中这一情况有所改变,接口中引入了default方法和static方法,interface中声明的方法默认为 public abstract 修饰,default方法

就相当于只有public 修饰,并且可以有具体的实现,一样可以覆盖(参见下面的例子);static方法在interface里和在其他地方是一样的,类名.方法名调用即可。

  引入default主要目的是为了实现接口的升级。因为在原有的Java代码框架中,如果要对接口进行升级就会导致所有接口的实现类都要被

修改,这就很麻烦了。那么怎样才能不破坏Java现有实现架构的情况下往接口里增加新方法又不至于大动干戈呢?于是乎,引入default方法,

具有默认方法的实现,这对这些库类的升级带来许多的便利。

举个具体的例子

  Java8集合接口中添加了一些default方法,对集合类API进行升级,比如Collection中的Stream()就是default方法

 1 import java.util.List;
 2 import java.util.stream.Stream;
 3
 4 /**
 5  * interface defined default method and static method
 6  *
 7  * @author mdyb
 8  *             date: 2017/8/11
 9  *             file: ISuper.java
10  */
11 public interface ISuper {
12     /**
13      * default method
14      */
15     default void showClass() {
16         System.out.println("class name of calling this method: " + this.getClass().getName());
17     }
18
19     /**
20      * static method
21      * @param iSupers
22      * @return
23      */
24     static ISuper[] filter(int p, ISuper... iSupers) {
25         ISuper[] supers = Stream.of(iSupers).filter(a -> a.getValueRandom() < p).toArray(ISuper[]::new);
26         return supers;
27
28     }
29     static ISuper[] filter(int p, List<ISuper> iSpers) {
30         return iSpers.stream().filter(a-> a.getValueRandom() < p).toArray(ISuper[]::new);
31     }
32
33
34     static void swap(int[] arr, int i, int j) {
35         arr[i] += arr[j];
36         arr[j] = arr[i] - arr[j];
37         arr[i] -= arr[j];
38     }
39
40     int getValueRandom();
41
42     int getValue();
43 }
 1 import java.util.Arrays;
 2 /**
 3  *
 4  * @author yushenglong
 5  *         date: 2017/8/11
 6  *         file: ISuperImpl.java
 7  */
 8 public class ISuperImpl implements ISuper {
 9
10     public static void main(String[] args) {
11         ISuper iSuper = new ISuperImpl();
12         iSuper.showClass(); // 无覆盖直接调用
13
14         System.out.println("\n====================");
15         ISuper iSuper2 = new ISuperImpl2();
16         iSuper2.showClass(); // 调用覆盖的方法
17
18         System.out.println("\n====================");
19         ISuper iSuper3 = new ISuperImpl3();
20         iSuper3.showClass(); // 调用覆盖的方法
21
22         System.out.println("\n====================");
23
24         ISuper iSuper31 = new ISuperImpl3();
25         ISuper iSuper21 = new ISuperImpl2();
26         ISuper iSuper11 = new ISuperImpl();
27
28         System.out.println("iSuper value = " + iSuper.getValue());
29
30         ISuper[] s = ISuper.filter(5000, iSuper, iSuper11, iSuper2, iSuper21, iSuper3, iSuper31);
31         ISuper[] s2 = ISuper.filter(4000, iSuper, iSuper11, iSuper2, iSuper21, iSuper3, iSuper31);
32         Arrays.stream(s).forEach((a) -> System.out.print(a.getValue() + " "));
33         System.out.println();
34         Arrays.stream(s2).forEach((a) -> System.out.print(a.getValueRandom() + " "));
35     }
36
37     private int value = (int) (Math.random() * 2000);
38
39     @Override
40     public int getValueRandom() {
41         return value + 3333;
42     }
43
44     @Override
45     public int getValue() {
46         return value;
47     }
48
49 }
50
51 class ISuperImpl2 implements ISuper {
52     private int value = (int) (Math.random() * 777);
53
54     // default 方法可以覆盖
55     @Override
56     public void showClass() {
57         System.out.println("before");
58         ISuper.super.showClass();
59         System.out.println("after");
60     }
61
62     @Override
63     public int getValueRandom() {
64         return (value + 2000) * 2;
65     }
66
67     @Override
68     public int getValue() {
69         return value;
70     }
71 }
72
73 class ISuperImpl3 implements ISuper {
74
75     private String status;
76
77     private int value = (int) (3141 + Math.random() * 600);
78
79     public ISuperImpl3() {
80         status = getClass().getName() + System.currentTimeMillis();
81     }
82
83     @Override
84     public void showClass() {
85         System.out.println("class status of calling this method: "+status + System.currentTimeMillis() + "\n" + Math.random());
86     }
87
88     @Override
89     public int getValueRandom() {
90         return (value + status.length() - (int) (1333 * Math.random())) / 2;
91     }
92
93     @Override
94     public int getValue() {
95         return value;
96     }
97 }

  Java8相对Java7还有许多新特性,等用到的时候再去仔细研究。

时间: 2025-01-07 13:41:01

Java8 default方法的相关文章

Java8新特性(一)_interface中的static方法和default方法

为什么要单独写个Java8新特性,一个原因是我目前所在的公司用的是jdk8,并且框架中用了大量的Java8的新特性,如上篇文章写到的stream方法进行过滤map集合.stream方法就是接口Collection中的default方法.所以准备专门写写关于java8新特性的文章,虽然现在10已经发布了.但还是要认真的去了解下新版本的变化. static方法 java8中为接口新增了一项功能:定义一个或者更多个静态方法.用法和普通的static方法一样. 代码示例 public interface

Java 8 中为什么要引出default方法

(原) default方法是java 8中新引入进的,它充许接口中除了有抽象方法以外,还可以拥用具有实现体的方法,这一点跟jdk8之前的版本已经完全不一样了,为什么要这样做呢? 拿List接口举例,在java 8以前的老系统中有一个开发人员自己写了一个类DefinedList,它继承于List接口. 毫无疑问,DefinedList将会实现List接口中的所有抽象方法. 在java 8中,甲骨文觉得其实可让List做更多的事,比如开发中常用的给List数据进行排序,于是它们想加一个sort方法.

Java8 默认方法

概述 Java8新增了接口的默认方法.使用default关键字. 默认方法就是接口可以有实现方法,而且不需要实现类来实现其方法.相对于JDK1.8之前的接口来说,新增了可以接口中实现方法. 可以说在接口中实现方法一部分原因是为了lambda表达式服务的,因为lambda表达式只能交给接口. 分类 语法 多个默认方法 因为接口中有了默认方法,一个类又可以实现多个接口,难免会碰到相同名称的方法,当一个类实现多个接口,多个接口中存在同名的default方法,就需要子类重新实现,避免二义性 静态默认方法

Spring5 接口 ImportBeanDefinitionRegistrar 中 default 方法

环境: java version "13.0.1" 2019-10-15 Java(TM) SE Runtime Environment (build 13.0.1+9) 今天在学习 Spring5 注解,想通过自定义的方式想 IOC 容器中加载类,其中一种方法为 用类实现 ImportBeanDefinitionRegistrar 接口,但是实现该接口后并未提示实现接口方法. ImportBeanDefinitionRegistrar中定义了两个方法: default void re

Java 8新特性——default方法(defender方法)介绍

我们都知道在Java语言的接口中只能定义方法名,而不能包含方法的具体实现代码.接口中定义的方法必须在接口的非抽象子类中实现.下面就是关于接口的一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public interface SimpleInterface {   public void doSomeWork(); } class SimpleInterfaceImpl implements SimpleInterface{   @Override   publ

Java 8的default方法详解

Java 8的default方法详解 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Java 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口的实现类.下面我们通过例子来说明这一点. public class MyClass implements InterfaceA { public static void main(String[] args){ } @Override public void saySomething(

jdk1.8新特性之接口default方法

众所周知,default是java的关键字之一,使用场景是配合switch关键字用于条件分支的默认项.但自从java的jdk1.8横空出世以后,它就被赋予了另一项很酷的能力--在接口中定义非抽象方法. 众所周知,java的接口只能定义静态且不可变的常量或者公共抽象方法,不可能定义非抽象的具体方法.但自从jdk1.8横空出世以后,它就被default关键字赋予了另一项很酷的能力--在接口中定义非抽象方法.好了不废话了,看具体例子吧: 1.父接口Iterable,定义了两个default方法forE

java8 接口的default方法和静态方法

以前,接口里的方法要求全部是抽象方法,java8以后允许在接口里定义默认方法和类方法.不同的是:默认方法可以通过实现接口的类实例化的对象来调用,而类方法就相对于工具方法了.需要注意的是,此处的静态方法只能被public修饰(或者省略不写),不能是private或者protected. 好处:在Java 8 之前,接口不能有静态方法,因此按照惯例,接口Type 的静态工厂方法被放一个名为ypes 的不可实例化的伴生类中.例如Java Collections Framework的集合接口有45 个工

Java8默认方法

Java8引入的接口默认方法实现一个新的概念.此功能是为了向后兼容性增加,使旧接口可用于利用JAVA8. lambda表达式的能力,例如,列表或集合接口不具备forEach方法声明.从而增加了这样的方法只会打破收集框架实现. Java8引入了默认的方法使列表/Collection接口可以拥有forEach默认方法,并实行类实现这些接口不需要实现相同功能. 语法 public interface vehicle { default void print(){ System.out.println(