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