接口
在抽象类
中,抽象方法本质上是定义接口规范:也就是说,规定父类的接口,从而保证所有子类都有相同的接口实现,这样,多态就能发挥威力。
如果一个抽象类没有字段,所有的方法都是抽象方法,就可以把这个抽象类改写为接口。在Java中,使用interface
可以声明一个接口:
interface Person {
void run();
String getName();
}
所谓interfase
,就是比抽象类更抽象的纯抽象接口,因为接口中连字段都不能有。因为接口定义的所有方法默认都是public abstract
的,所以这两个修饰符不需要写出来(写不写效果都一样)。
当一个具体的class
去实现一个interface
时,需要使用implements
关键字。
我们知道,在Java中,一个类只能继承自另一个类,不能从多个类继承。也就是说一个类只能有一个父类,但是一个类可以实现多个interface
。例如:
class Student implements Person, Hello { // 实现了两个interface
...
}
抽象类和接口的异同点
相同点:
- 抽象类和接口都不能直接实例化(即创建对象);
- 抽象类的子类/接口的实现类,都必须实现抽象类/接口中的抽象方法才能被实例化
接口继承
一个interface
可以继承另一个interface
。使用extends
继承,它相当于扩展了接口的方法。例如:
interface Hello {
void hello();
}
interface Person extends Hello {
void run();
String getName();
}
此时,Person
接口继承自Hello
接口,因此,Person
接口现在实际上有3个抽象方法签名,其中一个来自继承的Hello
接口。