其它关键字:
其它关键字:
一、功能
- 多继承:Java不支持多继承,因此当需要从多个类中派生一个子类时,需要使用接口。
- 提取多个子类共有的功能。例如子弹、气球都可以飞,将飞封装成接口。
二、接口的使用
- 使用 interface 定义:
interface 接口名{ }
- Java中,接口和类是并列的结构
- 定义接口中的成员:
-
- JDK 7 及以前,只能定义 全局常量
public static final
和 抽象方法public abstract
,定义时可以省略,例如int MIN_SPEED = 1;
以及void stop();
- JDK 7 及以前,只能定义 全局常量
-
- JDK 8:还可以定义静态方法
public static void 方法名(){//...}
、默认方法public default void 方法名(){//...}
。静态方法只能通过接口调用。默认方法可以通过实现类的对象调用,也可以被实现类重写。
- JDK 8:还可以定义静态方法
- 接口中不能定义构造器,意味着接口不能实例化
- Java中通常让类实现(implements)接口。
class 类名 implements 接口名 { }
。 -
- 如果实现类覆盖了接口中的所有抽象方法,那么该类可以实例化。否则该类仍是一个抽象类。
- 类可以实现多个接口:
class 类名 extends 父类 implements 接口1,接口2 { }
- 接口和接口之间可以有继承关系:
interface 接口1 extends 接口2,接口3 { }
- 接口具有多态性
有接口USB,定义starts()、stop()两个方法。
有实现类Flash重写了starts()、stop()。
定义类Computer,内部有传输数据的方法transferData(USB usb)
class Computer{
public void transferData(USB usb){
usb.start();
System.out.println("开始传输");
usb.end();
}
}
运行代码:
Computer computer = new Computer();
computer.transferData(new Flash());
可以看到:定义transferData(USB usb)
方法时,形参是接口USB,实际传入的是Flash类的实例对象。
- 接口实际上是定义的一种规范。例如JDBC中连接数据库的接口,将 添加 规定为 add()等等…但接口中并没有具体的方法体。针对不同的数据库,对接口有不同的实现类,这些实现类称为驱动。接口的主要用途就是被实现类实现,开发项目往往是面向接口编程。
- 接口的匿名实现类。
接口名 对象名 = new 接口名(){ //重写方法};
,匿名实现类的对象是有名的。例如:
USB phone = new USB(){
@Override
public void start() {
}
@Override
public void end() {
}
};
- 接口的匿名实现类的匿名对象。例如:
computer.transferData(new USB(){
@Override
public void start() {
}
@Override
public void end() {
}
});
三、接口的应用
四、当父类和接口有冲突
当子类继承的父类和实现的接口中有同名的:
- 有同名的属性时:编译错误。
- 有同名的方法时:子类调用时运行的是父类的方法。
五、当接口与接口有冲突
当子类实现的接口中有同名的:
- 有同名的默认方法:编译错误。报错:接口冲突。子类必须重写该方法。想调用接口中的默认方法时:
接口.surper.方法名();
- 有同名的抽象方法:由于子类会重写抽象方法,调用的是子类重写的。