一、接口的概念
接口使用interface关键字定义,它是一种行为规范 / 能力标准,主要用来规定 "某类事物必须具备哪些行为"。
public interface 接口名 {
}
接口可以理解为:
- 制定规则;
- 定义能力;
- 不关心具体实现,只关心 "能不能做"。
二、接口的基本定义
public interface Flyable {
// 抽象方法:规定"能飞"
void fly();
}
在 Java 8 以后,接口中可以包含:
- 抽象方法;
- 默认方法
default; - 静态方法
static; - 私有方法
private。
但初学阶段,先掌握最核心的:抽象方法 + 类实现接口。
三、类实现接口
类通过implements关键字实现接口,并必须实现接口中的所有抽象方法。
public class Bird implements Flyable {
@Override
public void fly() {
System.out.println("鸟扇动翅膀飞翔");
}
}
完整示例
public interface Flyable {
void fly();
}
public class Bird implements Flyable {
@Override
public void fly() {
System.out.println("鸟扇动翅膀飞翔");
}
}
public class Plane implements Flyable {
@Override
public void fly() {
System.out.println("飞机依靠发动机飞行");
}
}
public class TestFly {
public static void main(String[] args) {
Flyable f1 = new Bird();
Flyable f2 = new Plane();
f1.fly();
f2.fly();
}
}
输出:
鸟扇动翅膀飞翔
飞机依靠发动机飞行
四、接口的特点
| 特点 | 说明 |
|---|---|
| 接口不是类 | 使用interface定义 |
| 接口不能创建对象 | 不能new 接口名() |
接口中的方法默认是public abstract |
可以不写,但编译后仍然是公共抽象方法 |
接口中的变量默认是public static final |
必须赋值,且不能修改 |
| 类实现接口 | 使用implements |
| 实现类必须实现全部抽象方法 | 除非是抽象类 |
| 一个类可以实现多个接口 | implements A, B, C |
五、接口中的常量
接口中可以定义常量,格式:
public static final 类型 常量名 = 值;
例如:
public interface Constants {
int MAX_COUNT = 100;
String NAME = "Java";
}
接口里的变量会被自动看作:
public static final
所以必须定义时赋值,并且不能修改。
六、接口与抽象类的区别
| 对比项 | 抽象类 | 接口 |
|---|---|---|
| 定义方式 | abstract class |
interface |
| 构造方法 | 有 | 没有 |
| 成员变量 | 普通成员变量 | 主要是常量 |
| 方法 | 抽象方法、普通方法 | 抽象方法、默认方法、静态方法等 |
| 关系 | 继承关系:extends |
实现关系:implements |
| 单继承 / 多实现 | 类只能单继承 | 类可以多实现 |
| 作用 | 共性模板 + 部分实现 | 行为规范、能力标准 |
七、接口的多实现
一个类可以同时实现多个接口,这是接口最重要的优势之一。
public interface Flyable {
void fly();
}
public interface Swimmable {
void swim();
}
public class Duck implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("鸭子飞起来");
}
@Override
public void swim() {
System.out.println("鸭子游泳");
}
}
public class TestDuck {
public static void main(String[] args) {
Duck duck = new Duck();
duck.fly();
duck.swim();
}
}
八、接口的继承
接口也可以继承接口,并且支持多继承。
public interface Flyable {
void fly();
}
public interface Attackable extends Flyable {
void attack();
}
public class Bird implements Attackable {
@Override
public void fly() {
System.out.println("鸟飞");
}
@Override
public void attack() {
System.out.println("鸟攻击");
}
}
九、面向接口编程
面向接口编程的核心思想是:面向接口调用,不关心具体实现。
例如:
public interface USB {
void work();
}
public class Mouse implements USB {
@Override
public void work() {
System.out.println("鼠标工作");
}
}
public class Keyboard implements USB {
@Override
public void work() {
System.out.println("键盘工作");
}
}
public class Computer {
public void useUSB(USB usb) {
usb.work();
}
}
public class TestComputer {
public static void main(String[] args) {
Computer computer = new Computer();
computer.useUSB(new Mouse());
computer.useUSB(new Keyboard());
}
}
这里Computer不关心传入的是鼠标还是键盘,只关心它是否符合USB接口规范。
十、本章小结
- 接口 :使用
interface定义,是行为规范和能力标准。 - 抽象方法:接口中主要定义要实现的行为。
- 类实现接口 :使用
implements,必须实现全部抽象方法。 - 多实现:一个类可以实现多个接口。
- 面向接口编程:面向接口调用,降低耦合,提高扩展能力。