zoukankan      html  css  js  c++  java
  • java 22.接口的默认方法

    接口是多个类的公共规范,是一种引用数据类型,最重要的内容就是其中的抽象方法。

    定义

    • 接口中的抽象方法,修饰符必须是有两个固定的关键字:public abstract

    • 这两个关键字修饰符,可以选择性省略

    //接口
    public interface 接口名称{
        //接口抽象方法
        [public] [abstract] void methodAbs();
    }
    

    使用

    1. 接口不能直接使用,必须有一个实现类来实现该接口
    public class 实现类名称 implements 接口名称 {
        //...
    }
    
    1. 接口的实现类必须覆盖重写(实现)接口中所有的抽象方法

      实现:去掉抽象方法的abstract关键字,然后补上方法体大括号

    2. 创建实现类的对象,进行使用

    注意事项

    实现类如果没有覆盖重写接口中所有的抽象方法,那么这个实现类自己就必须是抽象类。因为在抽象类和抽象方法一节中,我们讲过了,抽象方法必须存在于抽象类,有抽象方法的类必须是抽象类。

    接口的默认方法

    java8开始,接口里允许定义默认方法,默认方法可以解决接口升级的问题

    public default 返回值类型 方法名称(参数列表){
        //方法体
    }
    

    比如有一个接口 x.java里面有抽象方法methodAbs

    public interface MyInterfaceDefault {
    
        public abstract void methodAbs();
    }
    

    有一个对应x接口的实现类y.java和z.java,y,z都用到了methodAbs

    y

    public class MyInterfaceDeaultA implements MyInterfaceDefault {
        @Override
        public void methodAbs() {
            System.out.println("实现了抽象方法,AAA");
        }
    }
    

    z

    public class MyInerfaceDefaultB implements MyInterfaceDefault {
        @Override
        public void methodAbs() {
            System.out.println("实现了抽象方法,BBB");
        }
    }
    

    某一天接口x升级了,里面新增了抽象方法methodAbs2

    public interface MyInterfaceDefault {
    
        public abstract void methodAbs();
    
        public abstract void methodAbs2();
    }
    

    这个时候实现类y,z因为没有覆盖重写x里的抽象方法b,就会报错了,现在我们要解决一个问题:接口x中现在要添加一个方法c,但是又不想影像y,z对x中a的调用,就是在x中添加的新方法拥有默认的方法体,而这种带有方法体的方法就叫做默认方法。

    下面我们注释掉原来的methodAbs2,然后添加默认方法:

    public interface MyInterfaceDefault {
    
        public abstract void methodAbs();
    
        //public abstract void methodAbs2();
    
        //默认方法
        public default void methodDefault(){
            System.out.println("这是新添加的默认方法");
        }
    }
    

    现在我们再看看y,z中其实已经不会报错了!因为y,z两个实现类已经继承了这个默认方法。

    我们来写个调用,验证下前面的内容

    public class MyInterfaceDemo {
        public static void main(String[] args) {
            MyInterfaceDeaultA a = new MyInterfaceDeaultA();
            a.methodAbs();  //调用抽象方法,实际运行的时右侧实现类
            a.methodDefault();  //调用默b认方法,如果实现类当中没有,会向上找
    
            MyInerfaceDefaultB b = new MyInerfaceDefaultB();
            b.methodAbs();  
            b.methodDefault(); 
        }
    }
    

    输出

    实现了抽象方法,AAA
    这是新添加的默认方法
    实现了抽象方法,BBB
    这是新添加的默认方法

    以上我们演示并验证了通过接口实现类对象来直接调用接口的默认方法,下面我们再来看一个知识点:

    接口实现类Z对接口x中的默认方法进行覆盖重写

    Z的代码

    public class MyInerfaceDefaultB implements MyInterfaceDefault {
        @Override
        public void methodAbs() {
            System.out.println("实现了抽象方法,BBB");
        }
    
        @Override
        public void methodDefault() {
            System.out.println("实现类Z覆盖重写了接口x的默认方法");
        }
    }
    

    重新执行下调用代码,然后看一下输出

    package interfaceDemo;
    
    public class MyInterfaceDemo {
        public static void main(String[] args) {
            MyInterfaceDeaultA a = new MyInterfaceDeaultA();
            a.methodAbs();  //调用抽象方法,实际运行的时右侧实现类
            a.methodDefault();  //调用默b认方法,如果实现类当中没有,会向上找
    
            MyInerfaceDefaultB b = new MyInerfaceDefaultB();
            b.methodAbs();
            b.methodDefault();
        }
    }
    

    输出

    实现了抽象方法,AAA
    这是新添加的默认方法
    实现了抽象方法,BBB
    实现类Z覆盖重写了接口x的默认方法

    OK,接口的默认方法就讲完了,是不是很简单!

    更多学习笔记移步 https://www.cnblogs.com/kknote
  • 相关阅读:
    mybatis用mysql数据库自增主键,插入一条记录返回新增记录的自增主键ID
    spark-shell中往mysql数据库写数据报错
    SpringCloud学习笔记(8)分布式配置中心——config
    SpringCloud学习笔记(7)路由——Zuul
    docker学习
    SpringCloud学习笔记(4)负载均衡——Feign
    SpringCloud学习笔记(3)负载均衡——Ribbon
    SpringCloud学习笔记(2)注册中心——eureka
    SpringCloud学习笔记(1)Spring Cloud与Dubbo的对比
    linux搭建环境
  • 原文地址:https://www.cnblogs.com/kknote/p/15329888.html
Copyright © 2011-2022 走看看