• 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     }
  • 相关阅读:
    转------深入理解--Java按值传递和按引用传递
    排序算法 -------未完待续
    eclipse智能提示报错(to avoid the message, disable the...)
    关于hashcode 和 equals 的内容总结
    随笔 软件设计师 -----------考后总结
    wpf 中用 C# 代码创建 PropertyPath ,以对间接目标进行 Storyboard 动画.
    AvaloniaUI体验
    wpf 通过为DataGrid所绑定的数据源类型的属性设置Attribute改变DataGrid自动生成列的顺序
    wpf 在不同DPI下如何在DrawingVisual中画出清晰的图形
    基于libcurl实现REST风格http/https的get和post
  • 原文地址:https://www.cnblogs.com/wuyx/p/9129118.html
Copyright © 2020-2023  润新知