zoukankan      html  css  js  c++  java
  • 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();
        }
    }

    结果:

     

    身体是革命的本钱,爱跑步,爱生活!
  • 相关阅读:
    Day1:T1 模拟 T2 拓扑排序
    vijos1060 隔板法
    字符串处理:kmp算法
    vijos1004 博弈论
    vijos1009:扩展欧几里得算法
    有关浮点数的精度问题
    C++构造 下一个排列 的函数
    vijos1053 用spfa判断是否存在负环
    SPFA和FLOYD算法如何打印路径
    细节MARK
  • 原文地址:https://www.cnblogs.com/caozx/p/8531200.html
Copyright © 2011-2022 走看看