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 }
运行结果
import java.util.Arrays; /** * * @author mdyb * date: 2017/8/11 * file: ISuperImpl.java */ public class ISuperImpl implements ISuper { public static void main(String[] args) { ISuper iSuper = new ISuperImpl(); iSuper.showClass(); // 无覆盖直接调用 System.out.println("\n===================="); ISuper iSuper2 = new ISuperImpl2(); iSuper2.showClass(); // 调用覆盖的方法 System.out.println("\n===================="); ISuper iSuper3 = new ISuperImpl3(); iSuper3.showClass(); System.out.println("\n===================="); ISuper iSuper31 = new ISuperImpl3(); ISuper iSuper21 = new ISuperImpl2(); ISuper iSuper11 = new ISuperImpl(); System.out.println("iSuper value = " + iSuper.getValue()); ISuper[] s = ISuper.filter(5000, iSuper, iSuper11, iSuper2, iSuper21, iSuper3, iSuper31); ISuper[] s2 = ISuper.filter(4000, iSuper, iSuper11, iSuper2, iSuper21, iSuper3, iSuper31); Arrays.stream(s).forEach((a) -> System.out.print(a.getValue() + " ")); System.out.println(); Arrays.stream(s2).forEach((a) -> System.out.print(a.getValueRandom() + " ")); } private int value = (int) (Math.random() * 2000); @Override public int getValueRandom() { return value + 3333; } @Override public int getValue() { return value; } } class ISuperImpl2 implements ISuper { private int value = (int) (Math.random() * 777); // default 方法可以覆盖 @Override public void showClass() { System.out.println("before"); ISuper.super.showClass(); System.out.println("after"); } @Override public int getValueRandom() { return (value + 2000) * 2; } @Override public int getValue() { return value; } } class ISuperImpl3 implements ISuper { private String status; private int value = (int) (3141 + Math.random() * 600); public ISuperImpl3() { status = getClass().getName() + System.currentTimeMillis(); } @Override public void showClass() { System.out.println("class status of calling this method: "+status + System.currentTimeMillis() + "\n" + Math.random()); } @Override public int getValueRandom() { return (value + status.length() - (int) (1333 * Math.random())) / 2; } @Override public int getValue() { return value; } }
Java8相对Java7还有许多新特性,等用到的时候再去仔细研究。