纳尼,接口中可以定义实例方法了?!
纳尼,接口中还可以定义静态方法了?!
没错,在 Java8 中新增了很多新的特性,其中就包括可以在接口中添加方法和变量。
首先我们来看下代码
- 1 public interface SourceInterface 2 {
- 3 int a = 5;
- 4 int b = 10;
- 5 6 public static int add() 7 {
- 8
- return a + b;
- 9
- }
- 10 11 public static void reset() 12 {
- 13 // do sth
- 14
- }
- 15 16 public
- default int f1() 17 {
- 18
- return a;
- 19
- }
- 20 21 public
- default void f2() 22 {
- 23 // do sth
- 24
- }
- 25
- }
- 26 27 class learnCode 28 {
- 29 public void userInterface() 30 {
- 31 int xx = SourceLearning.add();
- 32 SourceLearning.reset();
- 33 SourceLearning instance = new SourceLearning() 34 {
- 35@Override 36 public void f2() 37 {
- 38 // do sth 、
- 39
- }
- 40
- };
- 41 instance.f1();
- 42 instance.f2();
- 43 //int y=instance.add(); 注意这句会编译错误
- 44
- }
- 45
- }
代码中,我们可以发现以下几点不同:
1、在接口中,可以直接添加静态方法。
该静态方法作为接口的类方法,可以直接使用。不需要依托某个实现类。
2、在接口中,可以直接添加非抽象的实例方法。
在实例方法的申明中,需要增加 default 关键字修饰,因此这种方法也称为默认方法。他是接口自带的方法。接口被实现后,实例可以直接使用这些默认方法,同时如果对默认方法需要重写时,可以直接重写即可。
这两点新特性相对于 java8 之前的版本来说,可以说有质的改变。
引申:
可以增加方法的接口,开始变的更像抽象类。Java 类在实现了多个拥有默认方法的接口后,从侧面展现的像是实现了多重继承的影子。
注意:如果两个接口的默认方法出现重复申明,则需要在实现方法中重写该方法,否则 jvm 在执行时,无法确定究竟应该使用哪个接口的同名方法。这应该可以算是本次新引入特性的一个弊端,如果是指定使用的是某个接口中的默认方法时,可以采用
@Override
public void f2() {
SourceLearning.super.f2();
} 的形式
那么,java 为什么要引入默认方法呢?如果需要往接口中添加方法,直接使用抽象类即可,为什么要破坏已有的约定呢?
我认为主要原因如下:
在面向接口的编程过程中,发现原有的接口中,都需要添加一个相同的方法,那么现在有两种方案:
1) 接口换抽象类,抽象类中添加该方法
2) 接口中添加该抽象方法,在每一个接口的实现类中,均添加相同的实现方法。
无论选择哪种方法,都需要对已有的代码做出非常大的改动。可是如果使用默认方法,使对接的接口默认就拥有某些功能的实现,则很好的解决了假设的问题。
来源: http://www.cnblogs.com/jilodream/p/5786036.html