java8新特性——接口中的静态方法与默认方法

  以前我们知道,接口中的方法必须时抽象方法,而从 java8 开始接口中也可以有方法的实现了,叫做默认方法。

一 、默认方法(default修饰)

  在 java8 中,因为存在函数式接口,一个接口中只能存在一个普通方法,但是可以写多个默认方法,来为实现类提供方法实现。

 1 public interface MyInterface {
 2 
 3     /**
 4      * 默认方法
 5      * @return
 6      */
 7     default String getName () {
 8         return "张三";
 9     }
10     
11     default String getAge () {
12         return "13";
13     }
14     
15     /**
16      * 普通方法
17      * @return
18      */
19     String getHome ();
20 }

  既然接口中可以写方法的实现,那么就会出现与父类之间进行冲突的问题。

1 public class MyClass {
2 
3     public String getName () {
4         return "李四";
5     }
6 }

  上面的类中同样存在一个方法 getName 如果有一个类即实现 MyInterface 的接口, 又继承 MyClass 的类,那么这个类的 geName 方法到底使用接口中的还是父类中的呢?

 

 1 public class My_JAVA8_Test extends MyClass implements MyInterface{
 2 
 3     public static void main(String[] args) {
 4         My_JAVA8_Test test = new My_JAVA8_Test();
 5         System.out.println(test.getName());
 6     }
 7     
 8     
 9     @Override
10     public String getHome() {
11         return null;
12     }
13 
14 }

 

  答案是“李四”,因为,这里有一个类优先的原则:

    若一个接口中定义了一个默认方法,而另一个父类中又定义了一个同名方法时,选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。

 

  如果,此时,我们再定义一个接口,里面也有一个方法叫做getName,而一个类去同时实现这两个接口。那么这个类的 getName 方法到底会执行哪一个呢?

1 public interface MyFun {
2 
3     default String getName () {
4         return "王五";
5     }
6 }
 1 public class My_JAVA8_Test implements MyInterface, MyFun{
 2 
 3     public static void main(String[] args) {
 4         My_JAVA8_Test test = new My_JAVA8_Test();
 5         System.out.println(test.getName());
 6     }
 7     
 8     
 9     @Override
10     public String getHome() {
11         return null;
12     }
13 
14     /**
15      * 此时,类会让我们自己去重写,也可以自己选择使用上面2个接口中的方法
16      */
17     @Override
18     public String getName() {
19         return MyFun.super.getName();
20     }
21 
22 }

  此时,类会让我们自己去重写,也可以自己选择使用上面2个接口中的方法

  若一个接口中定义了一个默认方法,而另外一个接口中又定义了一个同名方法时,接口冲突。不管是否是默认方法,那么必须覆盖该方法来解决冲突。

 

二、静态方法

  在 java8 中的接口中不仅增加了默认方法,还增加了静态方法。使用方式接口名.方法名。

 1 public interface MyFun {
 2 
 3     default String getName () {
 4         return "王五";
 5     }
 6     
 7     static void test () {
 8         System.out.println("测试接口中静态方法!");
 9     }
10 }
1     public static void main(String[] args) {
2         MyFun.test();
3         
4     }

 

posted on 2018-06-03 14:17  Herrt灬凌夜  阅读(4735)  评论(6编辑  收藏  举报

导航