• JDK8新特性:接口的静态方法和默认方法


      之前分析Comparor接口的时候,看到方法居然有实现体,从吃惊到释然,一定是JDK8的新特性(原谅我之前一直用的1.7)。

      在JDK8之前,interface中有变量和方法,其中变量是public、final、static的,方法是public、abstract的,因此在interfacer中不需要显示写出这些修饰符。

    所以下面的写法是等价的。

    package com.czx;
    
    public interface BeforeJDK8Interface {
        
        public static final int num1 = 0;
        int num2 = 1;
        
        public abstract void method1();
        void method2();
    }

    JDK8以后,允许我们在interface中定义static和default方法(默认实现体)。

    package com.czx;
    
    public interface JDK8Interface {
        
        public static void staticMethod(){
            System.out.println("接口的静态方法");
        }
        
        public default void defaultMethod(){
            System.out.println("接口的默认方法");
        }
    }

    实现类:

    package com.czx;
    
    public class JDK8InterfaceImpl implements JDK8Interface{
        //dedault方法不一定要重写,当然根据需要也可以重写
    }

    测试类:

    package com.czx;
    
    public class Test {
        @org.junit.Test
        public void test(){
            //接口的静态方法必须通过接口名.方法名调用
            JDK8Interface.staticMethod();
            //default方法必须通过实现类的对象来调用
            JDK8Interface inter = new JDK8InterfaceImpl();
            inter.defaultMethod();
        }
    }

    结果:

      在实现类中对于interface的deault方法不一定要重写,当然根据需要也可以重写,此时的default修饰符要去掉

    package com.czx;
    
    public class JDK8InterfaceImpl implements JDK8Interface{
        //dedault方法不一定要重写,当然根据需要也可以重写,此时的default修饰符要去掉
        @Override
        public void defaultMethod(){
            System.out.println("实现类的重写方法");
        }
    }

    对于同样的测试类结果变成:

      由于java支持一个实现类可以实现多个接口,如果多个接口中存在同样的static和default方法会怎么样呢?

    1,如果多个接口中的存在同样的静态方法,此时并不会产生错误,因为jdk8只能通过接口调用接口中的静态方法,所以对编译器来说是可以区分的。

    2,如果多个接口中定义了一模一样的默认方法,那么必须在实现类中重写默认方法,否则编译失败。

    package com.czx;
    
    public interface JDK8Interface2 {
        
        public static void staticMethod(){
            System.out.println("JDK8Interface2的静态方法");
        }
        
        public default void defaultMethod(){
            System.out.println("JDK8Interface2的默认方法");
        }
    }

    实现类:

    package com.czx;
    
    public class JDK8InterfaceImpl implements JDK8Interface,JDK8Interface2{
        //这两个接口中存在相同的默认方法,必须重写
        @Override
        public void defaultMethod(){
            System.out.println("实现类的重写方法");
        }
    }

    测试类:

    package com.czx;
    
    public class Test {
        @org.junit.Test
        public void test(){
            //接口的静态方法必须通过接口名.方法名调用
            JDK8Interface.staticMethod();
            JDK8Interface2.staticMethod();
            //default方法必须通过实现类的对象来调用
            new JDK8InterfaceImpl().defaultMethod();
        }
    }

    结果:

     

    身体是革命的本钱,爱跑步,爱生活!
  • 相关阅读:
    探索事务日志与恢复模式(1-13)
    sql server 复制、镜像常见故障处理
    (3.2)mysqldump之备份单个表及脚本批量备份
    Log Explorer 恢复误删除、更新数据
    ApexSQL Log 从意外UPDATE和DELETE操作中恢复SQL Server数据
    ApexSQL Recover 恢复一个被drop的表的数据
    数据库参数调优--自动更新统计信息
    T-SQL利用笛卡尔积/窗口函数_分析函数/表连接累计、累加
    【生产问题】-dbcc checkdb报错-数据页故障
    (4.4)dbcc checkdb 数据页修复
  • 原文地址:https://www.cnblogs.com/caozx/p/8531200.html
Copyright © 2020-2023  润新知