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