接口Interface

Java里无法多重继承,和Python不同,子类是无法同时从多个父类那里来继承方法和属性的,而提供了另一种方式,接口interface,来实现类似的行为,简单来说,接口可以看做是一系列方法声明的集合,这里只有声明没有实现,就和抽象方法一样,没有函数体,理论上还可以包含有成员变量,这里必须是不可变常量,说得太多,直接看个具体的

interface Book {
    void chinese();
    void english();
}

这里需要注意的是interface必须是public,虽然此处是default,但是编译的时候会转成public,接口本来就是类和类之间的联系,如果再来个protected或者private就没啥意思了,除此之外,还有几点:

1:接口里方法都是抽象方法

2:接口里如果有成员变量,必须是static,final常量

3:接口里的方法必须要被实现接口的非抽象类全部实现

4:一个类智能继承一个抽象类,但却可以实现多个接口

在类里实现接口通过关键字implements来实现,比如这样

class Mybook implements Book {

比如接口还是上面的,来一个完整的实现

class Mybook implements Book {
    public void chinese() {
        System.out.println("My chinese book");
    }

    public void english() {
        System.out.println("My english book");
    }
}

public class Main {
    public static void main(String[] args) {
        Mybook mybook = new Mybook();
        mybook.chinese();
        mybook.english();
    }
}

如果给接口来个显示的private就会编译出错

javac Main.java
./Book.java:1: 错误: 此处不允许使用修饰符private
private interface Book {
        ^
1 个错误

接口方法设置private也是一样

javac Main.java
./Book.java:2: 错误: 此处不允许使用修饰符private
    private void chinese();
                 ^
1 个错误

将接口里chinese()的实现给注释掉,会清楚地报错

javac Main.java
Main.java:1: 错误: Mybook不是抽象的, 并且未覆盖Book中的抽象方法chinese()
class Mybook implements Book {
^
1 个错误

再次仔细看看接口的实现,似乎和类的继承没啥异样,就好比覆盖抽象父类的方法,然后如果再加一个接口

interface CookBook {
    void java();
    void python();
}

这里就可以实现多个接口来达到类似多重继承的效果

class Mybook implements Book, CookBook {
    public void chinese() {
        System.out.println("My chinese book");
    }

    public void english() {
        System.out.println("My english book");
    }

    public void java() {
        System.out.println("My java cookbook");
    }

    public void python() {
        System.out.println("My python cookbook");
    }
}

public class Main {
    public static void main(String[] args) {
        Mybook mybook = new Mybook();
        mybook.chinese();
        mybook.english();
        mybook.java();
        mybook.python();
    }
}

再来对比类和接口,可以这么来理解,对于接口,我们可以先来定义,生命接口里需要哪些方法,至于这个接口如何来实现,谁来实现暂且不需要知道;抽象类往往是需要知道一些有共同点的子类,再来抽象出父类,用比较流行的例子,给你一只猫,就直接抽象出一个动物类,就有点过度,起码再给一只狗,又这两个动物类再抽象出父类为动物类比较合适,接口则不需要这么抽象

发表评论