接口(interface)
接口的理解
接口就是规范,定义的是一组规则,体现了现实世界中"如果你是/要...则必须能..."的思想。继承是一个"是不是"的is-a关系,而接口实现则是 "能不能"的has-a
关系。
接口的本质是契约、标准、规范,就像我们的法律一样。制定好后大家都要遵守。
接口的定义
定义接口的关键字:interface
声明格式:
java
[修饰符] interface 接口名{
//接口的成员列表:
// 公共的静态常量
// 公共的抽象方法
// 公共的默认方法(JDK1.8以上)
// 公共的静态方法(JDK1.8以上)
// 私有方法(JDK1.9以上)
}
-
声明属性:必须使用
public
static
final
修饰 -
声明方法: jdk8之前,声明抽象方法,修饰为
public
abstract
jkd8: 声明静态方法、默认方法
jdk9:声明私有方法
不可以使用interface声明: 构造器、代码块等
interface的使用
接口和类的关系:实现关系
java
interface Flyable{
//接口
//全局常量
public static final int MIN_SPEED = 0; //最低速度
//可以省略 public static final
//自动默认为静态final的常量
int MAX_SPEED = 7900; //最高速度
public abstract void fly(); //默认为抽象方法,可以省略public abstract
//抽象方法,无方法体
}
interface Attackable{
//接口
public abstract void attack();
}
class Plane implements Flyable,Attackable{
//实现Flyable接口
//接口中存在抽象方法:① 使用abstract修饰方法,使方法为抽象方法
// ② 重写抽象方法
public void fly(){
System.out.println("Plane.fly");
}
@Override
public void attack() {
System.out.println("Plane.attack");
}
}
具体格式:
java
class A extend SuperA implements B,c{
}
//A是SuperA的子类
//A 是 B,C的 实现类
注意点:
一个接口中的所有属性都默认为
public final
修饰,为常量,赋值后不可更改一个接口中所有的方法,都为
public abstrace
修饰,为抽象方法
- 一个类可以实现多个接口
- 类针对于接口的多实现,一定程度上就弥补了类的单继承的局限性
- 一个类实现了一个接口,这个类必须将实现接口中所有的抽象方法进行重写,否则要将此类声明为抽象类
接口和接口的关系:继承关系
使用关键字
extends
进行继承
java
interface AA{
void method1(); //抽象方法,无方法体
}
interface BB{
void method2();
}
interface CC extends AA,BB{//接口可以多继承
}
接口的多态性
接口名 变量名 = new 实现类对象
java
package interfaceTest;
public class UsbTest {
public static void main(String[] args) {
//1,创建接口实现类的对象
Computer computer = new Computer();
Printer printer = new Printer();
//2.创建接口实现类的匿名对象
computer.transferDate(printer);
//多态的体现
computer.transferDate(new Camera());
//3. 创建接口匿名实现类的对象
USB usb1 = new USB(){
@Override
public void start() {
System.out.println("U盘开始工作");
}
@Override
public void stop() {
System.out.println("U盘停止工作");
}
};
computer.transferDate();
}
}
class Computer{ //电脑类
public void transferDate(USB usb){
System.out.println("设备连接成功");
usb.start();
System.out.println("数据传输细节操作");
usb.stop();
}
}
class Printer implements USB{
@Override
public void start() {
System.out.println("打印机工作");
}
@Override
public void stop() {
System.out.println("打印机结束工作");
}
}
class Camera implements USB{
@Override
public void start() {
System.out.println("照相机工作");
}
@Override
public void stop() {
System.out.println("照相机结束工作");
}
}
interface USB{
//声明常量 省略
public abstract void start();
void stop();
}