jdk8新加入的default方法

default方法的加入是为了兼容jdk8以前的版本的需要。
(1)当前有两个接口MyInterface和MyInterface1,它们都有相同名字的default方法,之后实现类Myclass同时implements了MyInterface和MyInterface1,同时Myclass实现了default方法,此时Myclass调用default调的是谁的?

(2)一个接口I有一个default方法,另一个实现类A实现了了此接口,并且重写了default方法,之后另一个类B继承了实现类A并且实现了接口I,那么在这种情况下,实现类B调用的default方法又是谁的呢?针对这两种情况编写测试代码:

接口MyInterface

1
2
3
4
5
6
7
8
/**
* Created by CeaserWang on 2017/1/16.
*/
public interface MyInterface {
default void meyhod(){
System.out.println("MyInterface");
}
}

接口MyInterface1

1
2
3
4
5
public interface MyInterface1 {
default void meyhod(){
System.out.println("MyInterface1");
}
}

实现类ExtendsClass

1
2
3
4
5
6
public class ExtendsClass implements  MyInterface {

public void meyhod(){
System.out.println("ExtendsClass");
}
}

实现类FixClass

1
2
3
public class FixClass extends  ExtendsClass implements  MyInterface1 {

}

测试类Myclass

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Myclass implements  MyInterface,MyInterface1 {

public void meyhod(){
System.out.println("Myclass");
//MyInterface1.super.meyhod();
}

public static void main(String[] args) {
Myclass myclass = new Myclass();
myclass.meyhod();

FixClass fixClass = new FixClass();
fixClass.meyhod();
}

}

运行Myclass 结果:

1
2
Myclass
ExtendsClass

结论:
针对于第一种情况,default方法调用的是自身的实现的default方法。
针对于第二种情况,default方法调用的是“就近原则”,ExtendsClass 首先被实现,那么首选是ExtendsClass 的default方法,因此输出“ExtendsClass”。