为什么需要引入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还有许多新特性,等用到的时候再去仔细研究。