当前位置: 主页 > JAVA语言

java接口设计规范-JavaSE8允许接口中定义的默认方法

发布时间:2023-06-09 16:11   浏览次数:次   作者:佚名

前言:Java程序设计语言中,接口用来对类进行需求描述。它描述了一个类具有的功能。

1、概念:Java中,接口不是类,而是对类的一组需求描述,描述了类具有的功能。接口描述了类所具有的功能,一般不对功能做具体的实现(可以为接口中的方法提供一个默认的实现,使用default修饰符标记方法,Java SE 8允许接口增加静态方法),功能的具体实现由实现接口的类依据各自的需求自行实现。

2、定义和实现接口:

(1)定义:Java中使用interface修饰符标记来定义接口。

(2)实现:一个类可以通过关键字implement实现一个或多个接口。实现了接口的类,必须实现接口中所定义的所有未实现的方法,或者必须将类设计为abstract的。

public interface TestInterfaceA {
    void funTestA(); 
    static void funTestB() { //静态方法
        System.out.print("Interface Static fun");
    }
    default void funTestC() { //默认方法
        System.out.print("Interface Default fun");
    }
}

金税开票接口开发规范_java接口设计规范_java接口返回值是接口

如上,定义了一个接口TestInterfaceA,在这个接口中,定义了一个未实现的方法funTestA,所有实现了这个接口的非抽象类都须实现funTestA方法;funTestB方法是一个静态方法,这是Java SE 8中新增加的特性;funTestC方法用default标记java接口设计规范,说明这是一个默认方法,提供了默认实现。

3、默认方法冲突:

(1)超类优先:如果一个类的超类和它所实现的接口同时定义了一个同样的方法(同名且同参数,且该方法在接口中被定义为默认方法),那么将以超类的方法为准,接口中定义的默认方法会被忽略。

public class STestA {
    public void testDefaultFun(){
        System.out.print("STestA");
    }
}
public interface ITestA {
    default void testDefaultFun(){
        System.out.print("ITestA");
    }
}
public class TestImpl extends STestA implements ITestA {
}

java接口设计规范_java接口返回值是接口_金税开票接口开发规范

如上,在类STestA和接口ITestA中同时定义一个相同的testDefaultFun方法java接口设计规范,类TestImpl继承类STestA并且实现了接口ITestA,此时编译器显示没有问题。当在其他程序中通过TestImpl的一个实例对象调用方法testDefaultFun时,将输出“STestA”。

(2)接口冲突:如果一个类实现了多个接口(未继承其他超类),在每个接口中都提供了一个同样的默认方法,则类必须覆盖这个方法来解决冲突。

public interface ITestA {
    default void testDefaultFun(){
        System.out.print("ITestA");
    }
}
public interface ITestB {
    default void testDefaultFun(){
        System.out.print("ITestB");
    }
}
public class TestImpl implements ITestA ,ITestB{
    @Override
    public void testDefaultFun() {
        ITestA.super.testDefaultFun();
    }
}

java接口返回值是接口_金税开票接口开发规范_java接口设计规范

如上,两个接口ITestA和ITestB同时定义了相同的方法testDefaultFun,类TestImpl实现了接口ITestA和ITestB,此时,如果没有在TestImpl类中覆盖方法testDefaultFun,编译器将会报错,当覆盖了这个方法后,编译器报错消失。