接口简介
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 34 课,共 87 课。
你已经了解了抽象类如何定义子类必须遵循的契约。但如果你想让一个类遵循多个契约,该怎么办?Java 不允许一个类继承多个类,但它通过接口解决了这个问题。
接口是一种契约,它定义了一个类能做什么,但不指定它如何实现。与抽象类不同,接口默认只包含方法签名,不包含实现:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}把接口看作一种承诺。当一个类实现接口时,它承诺为该接口中声明的所有方法提供实现。接口定义了能力,而类提供了行为。
接口使用 interface 关键字声明,而不是使用 class。接口中的所有方法都隐式为 public 和 abstract,因此你不需要写出这些关键字:
public interface Playable {
void play(); // 隐式声明为 public abstract
void pause();
void stop();
}接口也可以声明常量,这些常量会隐式地成为 public static final:
public interface GameConstants {
int MAX_PLAYERS = 4; // 隐式声明为 public static final
}在下一课中,你将学习类如何使用 implements 关键字来实现接口。
挑战
简单让我们通过定义接口来构建一个设备控制系统,描述不同设备可以执行哪些操作。本挑战重点是创建接口:接口是定义功能但不指定其工作方式的契约。
你要将代码分布在三个文件中:
Switchable.java:创建一个接口,定义设备可切换的含义。任何可切换的设备都应该能够开启和关闭。声明两个方法:turnOn()和turnOff()。请记住,接口方法会隐式地成为 public 和 abstract,因此你只需要编写方法签名。Adjustable.java:再创建一个接口,定义设备可调节的含义。可调节的设备应该能够设置其级别。声明一个方法setLevel(int level)。另外,添加一个值为100的常量MAX_LEVEL:请记住,接口中的常量会隐式地成为public static final。Main.java:通过打印接口相关信息,展示你的接口定义正确。你会收到一个输入:级别值(int)。打印以下三行:Switchable methods: turnOn, turnOffAdjustable methods: setLevelMax level constant: [MAX_LEVEL value](从 Adjustable 接口访问该常量)
Setting level to: [input level]
你会收到一个输入:级别值(int)。
本挑战只关注接口的定义:接口是描述功能的蓝图。在下一课中,你将学习类如何实际实现这些接口,从而提供真正的行为!
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int level = scanner.nextInt();
// TODO:输出有关接口的信息
// 输出:"Switchable methods: turnOn, turnOff"
// 输出:"Adjustable methods: setLevel"
// 输出:"Max level constant: ",后面接 Adjustable.MAX_LEVEL
// 输出:"Setting level to: ",后面接输入的 level
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器