Java 接口详解
一、课程信息
学习目标
- 理解 Java 接口的概念、作用和特点。
- 掌握接口的定义和实现方式。
- 学会使用接口实现多态和代码复用。
- 了解接口在实际开发中的应用场景。
课程重点
- 接口的定义和语法规则。
- 接口的实现和方法重写。
- 接口在多态中的应用。
课程难点
- 理解接口与抽象类的区别。
- 灵活运用接口解决实际问题。
二、课程导入
生活中的接口实例
在生活中,接口无处不在。例如,USB 接口是计算机与外部设备(如 U 盘、鼠标、键盘等)之间的一种标准连接方式。只要设备符合 USB 接口的标准,就可以连接到计算机上使用。不同的设备通过 USB 接口实现了与计算机的交互,这体现了接口的标准化和通用性。
编程中的问题引入
在 Java 编程中,有时我们希望不同的类具有相同的行为,但这些类可能没有直接的继承关系。例如,飞机、汽车、轮船都具有移动的功能,但它们属于不同的类别。如果使用继承来实现这些功能,会导致类的层次结构变得复杂,而且不符合面向对象的设计原则。这时,接口就可以发挥作用,它可以定义一组规范,让不同的类去实现这些规范。
// 传统方式,类之间关系复杂
class Aircraft {
void move() {
System.out.println("飞机在空中移动");
}
}
class Car {
void move() {
System.out.println("汽车在公路上移动");
}
}
class Ship {
void move() {
System.out.println("轮船在水面上移动");
}
}
三、接口的概念
定义
接口是一种特殊的抽象类型,它只包含常量和抽象方法的定义,不包含具体的实现。接口可以看作是一种契约,实现接口的类必须遵守这个契约,实现接口中定义的所有抽象方法。
作用
- 实现多继承:Java 不支持类的多重继承,但一个类可以实现多个接口,从而达到类似多重继承的效果。
- 规范行为:接口定义了一组方法的签名,实现接口的类必须实现这些方法,保证了类的行为符合一定的规范。
- 提高代码的可扩展性和可维护性:通过接口,可以将不同的实现类统一起来,方便代码的管理和扩展。
四、接口的定义
语法格式
interface 接口名 {
// 常量定义
数据类型 常量名 = 值;
// 抽象方法定义
返回类型 方法名(参数列表);
}
示例代码
// 定义一个移动接口
interface Movable {
// 常量
int MAX_SPEED = 100;
// 抽象方法
void move();
}
注意事项
- 接口中的常量默认是
public static final
类型的,必须在定义时初始化,且不能被修改。 - 接口中的方法默认是
public abstract
类型的,不需要使用abstract
关键字修饰。
五、接口的实现
语法格式
class 类名 implements 接口名 {
// 实现接口中的抽象方法
@Override
public 返回类型 方法名(参数列表) {
// 方法体
}
}
示例代码
// 定义一个移动接口
interface Movable {
int MAX_SPEED = 100;
void move();
}
// 飞机类实现 Movable 接口
class Aircraft implements Movable {
@Override
public void move() {
System.out.println("飞机在空中以最高速度 " + MAX_SPEED + " 飞行");
}
}
// 汽车类实现 Movable 接口
class Car implements Movable {
@Override
public void move() {
System.out.println("汽车在公路上以最高速度 " + MAX_SPEED + " 行驶");
}
}
public class InterfaceImplementationExample {
public static void main(String[] args) {
Aircraft aircraft = new Aircraft();
Car car = new Car();
aircraft.move();
car.move();
}
}
实现多个接口
一个类可以实现多个接口,用逗号分隔接口名。
interface Flyable {
void fly();
}
interface Swimmable {
void swim();
}
class Duck implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("鸭子在空中飞");
}
@Override
public void swim() {
System.out.println("鸭子在水里游");
}
}
六、接口与多态
多态的实现
接口可以实现多态,通过接口类型的引用变量引用实现类的对象,调用接口中定义的方法时,会根据实际对象的类型调用相应的实现方法。
示例代码
interface Shape {
double area();
}
class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
class Rectangle implements Shape {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
@Override
public double area() {
return length * width;
}
}
public class InterfacePolymorphismExample {
public static void main(String[] args) {
Shape circle = new Circle(5);
Shape rectangle = new Rectangle(4, 6);
System.out.println("圆形的面积:" + circle.area());
System.out.println("矩形的面积:" + rectangle.area());
}
}
七、接口的继承
接口继承的概念
接口可以继承其他接口,使用 extends
关键字。一个接口可以继承多个接口,用逗号分隔。
示例代码
interface A {
void methodA();
}
interface B {
void methodB();
}
interface C extends A, B {
void methodC();
}
class MyClass implements C {
@Override
public void methodA() {
System.out.println("实现方法 A");
}
@Override
public void methodB() {
System.out.println("实现方法 B");
}
@Override
public void methodC() {
System.out.println("实现方法 C");
}
}
八、接口与抽象类的区别
比较项 | 接口 | 抽象类 |
---|---|---|
定义关键字 | interface | abstract class |
成员变量 | 只能是 public static final 常量 | 可以是各种类型的变量 |
方法实现 | 只能有抽象方法(Java 8 及以后可 有默认方法和静态方法) | 可以有抽象方法和具体方法 |
继承 / 实现 | 一个类可以实现多个接口 | 一个类只能继承一个抽象类 |
设计目的 | 强调行为的规范和统一 | 强调类的共性和模板 |
九、课堂练习
练习 1
创建一个 Drawable
接口,包含 draw
方法。创建 Circle
类和 Square
类实现 Drawable
接口,分别实现 draw
方法,输出不同的绘制信息。
练习 2
创建一个 Playable
接口,包含 play
方法。创建 MusicPlayer
类和 VideoPlayer
类实现 Playable
接口,分别实现 play
方法,输出不同的播放信息。
十、课程总结
重点回顾
- 接口的概念、作用和特点。
- 接口的定义和实现方式。
- 接口在多态中的应用。
- 接口与抽象类的区别。
注意事项
- 实现接口时,必须实现接口中的所有抽象方法。
- 合理使用接口和抽象类,根据具体需求选择合适的设计方式。
十一、课后作业
作业 1
设计一个简单的电器系统,包含 ElectricalDevice
接口,有 turnOn
和 turnOff
方法。创建 TV
类、Refrigerator
类和 Fan
类实现 ElectricalDevice
接口,分别实现 turnOn
和 turnOff
方法,输出不同的开关信息。
作业 2
创建一个 Sortable
接口,包含 sort
方法。创建 ArraySorter
类实现 Sortable
接口,在 sort
方法中实现对整数数组的排序功能。