• java8新特性学习五(接口中的默认方法与静态方法)


    一、接口中的默认方法

    java8新增了默认方法,可以在声明方法的时候,给方法一个默认的实现,而不需要实现类去实现其方法。默认方法用default关键字修饰,它默认就是public权限的

    特点

    1.所有的实现类都会自动继承接口中定义的默认方法;

    2.接口中的默认方法可以被实现类重写;

    3.在被调用时,实现类重写后的方法优先于默认方法;

    4.和java8之前一样,在接口中仍然不允许定义普通的实现方法,接口任然会保持除这些新特性外的所有原有特性.

    示例:

     默认方法接口1

    public interface MyDefaultInterface1 {
    
        default String getStr(){
            return "MyDefaultInterface1默认方法getStr";
        }
    
        public static void show(){
            System.out.println("MyDefaultInterface1中的show静态方法");
        }
    }
    

      默认方法接口2

    public interface MyDefaultInterface2 {
    
         default String getStr(){
            return "MyDefaultInterface2默认方法getStr";
        }
    
         static void show(){
            System.out.println("MyDefaultInterface2中的show静态方法");
        }
    }
    

     跟接口默认方法同名的类方法 

    public class MyClass {
    
        public String getStr(){
            return "MyClass中的getStr方法";
        }
    } 
    SubClass1实现MyDefaultInterface1接口
    public class SubClass1 implements MyDefaultInterface1 {
    
    
    }
    

      SubClass2继承MyClass类,并实现MyDefaultInterface1接口

    public class SubClass2 extends MyClass implements MyDefaultInterface1 {
    
    
    }
    

      SubClass3实现MyDefaultInterface1和MyDefaultInterface2接口,出现冲突,必须实现其中一个接口的方法

    public class SubClass3 implements MyDefaultInterface1,MyDefaultInterface2 {
    
        @Override
        public String getStr() {
            return MyDefaultInterface1.super.getStr();
          //  return MyDefaultInterface2.super.getStr();
        }
    }

      测试结果:

    public class TestDefaultInterface {
    
        public static void main(String[] args) {
            //自动继承MyDefaultInterface1中的默认方法
            SubClass1 subClass1=new SubClass1();
            System.out.println(subClass1.getStr());//MyDefaultInterface1默认方法getStr
    
            //实现类重写后的方法优先于默认方法
            System.out.println("----------------");
            SubClass2 subClass2=new SubClass2();
            System.out.println(subClass2.getStr());//MyClass中的getStr方法
    
            System.out.println("----------------");
            SubClass3 subClass3=new SubClass3();
            System.out.println(subClass3.getStr());//MyDefaultInterface1默认方法getStr
    
            System.out.println("------静态方法调用------");
            MyDefaultInterface1.show();//MyDefaultInterface1中的show静态方法
        }
    }

    接口默认方法的“类优先”原则

    若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时:

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

      2.接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突。

    为什么引入default方法?

    (1)以前的接口中只要定义了方法,都需要在实现类中进行实现。即使是个空的实现,也必须写出来;但是在新特性中,添加了默认方法,就无需在实现类中再次实现了,除非想要再次实现,直接重写就可以了;

    (2)为接口添加新的默认方法,是不会破坏原有接口的实现;

    (3)不需要修改接口的实现类,就可以为接口添加新的方法实现;

    (4)对于已经发布的版本,是无法在给接口添加新方法的同时而不影响已有的实现,因此引入了default。目的是为了解决接口的修改与已有的实现不兼容的问题。

    二. 静态方法

    和普通的静态方法定义一样,区别是静态有方法的实现,普通方法只有声明。实现接口的类或者子接口不会继承接口中的静态方法。

    特点

    1.只能是静态方法所属的接口来调用(即使是子类等等都不行)

    2.必须有方法体,区别于普通方法必须不能有方法体;

    3.实现接口的类或者子接口不会继承接口中的静态方法。static不能和default同时使用。在java8中很多接口中都增加了静态方法

    用途

    1.因为是静态方法,它是不能被实现类重写的(否则编译异常:This static method cannot hide the instance method from Object),因此,它可以用来提供防止实现类不良重写的保障;

    2.常常可以作为工具型的方法,比如:空值检查,集合类排序等等;

    3.比如可以将java.util.collections类改成接口(eg:Collection) 中的静态方法,进行调用;

    参考:https://www.cnblogs.com/Hermioner/p/9660383.html

  • 相关阅读:
    php实现导出excel功能(转)
    nginx + php-fpm 开启 PATH_INFO 模式
    openEuler安装mariadb后进程查看有[ERROR] mysqld: Server GSSAPI错误
    CentOS 8开放防火墙端口
    ssh连接PVE下debian11的LXC容器非常慢之解决方法
    debian11安装SRS教程
    用python下载网页或图片
    解决Debian vim鼠标无法选中、复制问题
    在Ubuntu系统中安装pymssql
    Mariadb设置允许远程链接
  • 原文地址:https://www.cnblogs.com/mabaoying/p/12980395.html
Copyright © 2020-2023  润新知