接口 interface

java提供了一个关键词interface 用这个关键词来定义接口这种特殊结构
public interface 接口名(){
  //成员变量(常量)
  //public static final String NAME="张三"
  //public static final 不加 java自动帮你加上
   String NAME="张三";
  //成员方法(抽象方法)
  //public abstract 不加 java 自动帮你加上
  void test1();
}
接口的常量可以通过接口名.常量名

接口的好处

弥补了类单继承的不足,一个类同时可以实现多个接口。
让程序可以面向接口编程,这样程序员可以灵活方便的切换各种业务实现。

接口使用场景

对象有什么?

比如:

我有车

我有房

我有钱

....

JDK8接口的新特性

随着JDK版本的升级,在JDK8版本以后接口中能够定义的成员也做了一些更新,从JDK8开始,接口中新增的三种方法形式。

我们看一下这三种方法分别有什么特点?

默认方法:必须使用default修饰,默认会被public修饰 实例方法:对象的方法,必须使用实现类的对象来访问。私有方法:必须使用private修饰。(JDK 9开始才支持的) 实例方法:对象的方法。

静态方法:必须使用static修饰,默认会被public修饰

public interface A {
    /**
     * 1、默认方法:必须使用default修饰,默认会被public修饰
     * 实例方法:对象的方法,必须使用实现类的对象来访问。
     */
    default void test1(){
        System.out.println("===默认方法==");
        test2();
    }

    /**
     * 2、私有方法:必须使用private修饰。(JDK 9开始才支持的)
     *   实例方法:对象的方法。
     */
    private void test2(){
        System.out.println("===私有方法==");
    }

    /**
     * 3、静态方法:必须使用static修饰,默认会被public修饰
     */
     static void test3(){
        System.out.println("==静态方法==");
     }

     void test4();
     void test5();
     default void test6(){

     }
}
接下来我们写一个B类,实现A接口。B类作为A接口的实现类,只需要重写抽象方法就可以了,对于默认方法不需要子类重写。

代码如下:

public class B implements A{
    @Override
    public void test4() {

    }

    @Override
    public void test5() {

    }
}
最后,写一个测试类,观察接口中的三种方法,是如何调用的
public class Test {
    public static void main(String[] args) {
        // 目标:掌握接口新增的三种方法形式
        B b = new B();
        b.test1();    //默认方法使用对象调用
        // b.test2();    //A接口中的私有方法,B类调用不了
        A.test3();    //静态方法,使用接口名调用
    }
}
综上所述:JDK8对接口新增的特性,有利于对程序进行扩展。

接口的其他细节

一个接口可以继承多个接口
public class Test {
    public static void main(String[] args) {
        // 目标:理解接口的多继承。
    }
}

interface A{
    void test1();
}
interface B{
    void test2();
}
interface C{}

//比如:D接口继承C、B、A
interface D extends C, B, A{

}

//E类在实现D接口时,必须重写D接口、以及其父类中的所有抽象方法。
class E implements D{
    @Override
    public void test1() {

    }

    @Override
    public void test2() {

    }
}
接口除了上面的多继承特点之外,在多实现、继承和实现并存时,有可能出现方法名冲突的问题,需要了解怎么解决(仅仅只是了解一下,实际上工作中几乎不会出现这种情况)
1.一个接口继承多个接口,如果多个接口中存在方法声明冲突,则此时不支持多继承
2.一个类实现多个接口,如果多个接口中存在方法声明冲突,则此时不支持多实现
3.一个类继承了父类,又同时实现了接口,父类中和接口中有同名的默认方法,实现类会有限使用父类的方法
4.一个类实现类多个接口,多个接口中有同名的默认方法,则这个类必须重写该方法。
综上所述:一个接口可以继承多个接口,接口同时也可以被类实现。
最后修改:2023 年 05 月 04 日
如果觉得我的文章对你有用,请随意赞赏