Java 中的接口
声明一个带有空方法头的 interface,再用 implements 在类里填满这些方法。写 interface Signal,带 void horn(); 且没有方法体。写 class Truck implements Signal,给 horn 一个打印 honk 的方法体。在 Yard.java 里创建一个 Truck 并调用 t.horn()。用 javac Yard.java 编译,再运行 java Yard。屏幕应显示 honk。第二个演示让一个类一次 implements 两个接口。枚举留给下一页——本课是方法的承诺,以及兑现承诺的类。
实现一个接口方法
重写页在已经 extends Car 的子类上重写了 horn。本页从没有方法体的承诺开始。打开 Yard.java。保持 public 类名为 Yard。若残留的 Car/Truck extends 演示会盖住接口故事,就删掉它们,并删掉带 super 的构造器打印、路径演示,以及任何键盘 Scanner。程序不应等待输入。不需要 import 行。
在类的上方声明接口:
interface Signal {
void horn();
}
方法头以分号结束。在本入门形态下,接口里的 horn 没有 { } 方法体。
声明兑现承诺的类:
class Truck implements Signal {
在 Truck 里写同名的 public 方法并填满方法体:
public void horn() {
System.out.println("honk");
}
关键字是 implements,不是 extends。类必须为接口上列出的每个方法提供方法体。本页只有 horn。
在 Yard.main 里创建一个 truck 并调用方法:
Truck t = new Truck();
t.horn();
这次调用运行写在 Truck 上的方法体,所以屏幕打印 honk。
interface Signal {
void horn();
}
class Truck implements Signal {
public void horn() {
System.out.println("honk");
}
}
public class Yard {
public static void main(String[] args) {
Truck t = new Truck();
t.horn();
}
}
在存放 Yard.java 的文件夹里运行 javac Yard.java。当圆括号、花括号和分号都匹配时,javac 自己不写输出行。然后运行 java Yard——不要写成 java Yard.java。运行命令里去掉 .java 后缀。文件里只保留一个 public 类,使名称与 Yard 一致。接口 Signal 和辅助类 Truck 在本入门形态下不加 public。
屏幕显示 honk。把这次运行走一遍。Java 从 Yard.main 开始。new Truck() 创建一个承诺了 Signal 的 truck。t.horn() 运行 Truck 上的方法体并打印 honk。你从不写 new Signal()——接口只命名方法;类提供方法体和对象。
若 javac 拒绝,检查三件事。第一,类那一行必须写 implements Signal,不是 extends Signal。第二,每个接口方法都需要类上有匹配的方法。第三,在本教学形态下实现方法是 public,以便匹配接口的公开约定。若仍看到旧 override 文件里的 beep,切换到接口教学文件,再运行一次 java Yard。
看着屏幕把规则说出来:接口命名调用,类填满方法体,对象运行那个方法体。把 implements 放在拥有打印的那一类上。此页不要发明 enum。枚举留给下一课。
在一个类上实现两个接口
第二个程序保留 Yard 和 Truck。现在 Truck 实现两个接口。Signal 仍要求 horn。Mark 要求 show。类填满两个方法体。main 调用这两个方法。
interface Signal {
void horn();
}
interface Mark {
void show();
}
class Truck implements Signal, Mark {
public void horn() {
System.out.println("honk");
}
public void show() {
System.out.println("truck");
}
}
public class Yard {
public static void main(String[] args) {
Truck t = new Truck();
t.horn();
t.show();
}
}
用 javac Yard.java 编译,再运行 java Yard。屏幕先显示 honk,再显示 truck。第一行来自 Truck 上填满的 Signal 承诺。第二行来自同一类上填满的 Mark 承诺。在 implements 列表里用逗号分隔接口名:implements Signal, Mark。
再读一遍类头。一个类。两个接口。两个方法体。这就是不靠两个 extends 父类来兑现多个承诺的入门画面。Java 只允许一个类继承一个类;它可以实现多个接口。本页在一个小 Yard 文件里展示那份逗号列表。
若列表里有 Mark 却漏写 show,javac 会拒绝,因为列出的每个接口方法都需要方法体。若从 implements 列表去掉 Mark 却仍写 show,你得到的是普通方法,不是对 Mark 的接口兑现。想让两个承诺都被检查时,把两个名字都留在类那一行。
与 extends 重写对比
在重写页,Truck extends Car,并重写了父类已有方法体的 horn。本页上 Signal 从没有方法体开始,Truck implements Signal 提供第一份方法体。你仍编译 Yard.java 并运行 java Yard。你仍调用 t.horn()。新记号是 interface、implements,以及——在第二个演示里——用逗号分隔的 implements 列表。
若仍打开残留的 override 文件,你会看到 extends Car,或许还有 honk 旁边的 beep。切换到接口教学文件,让文件顶部显示 interface Signal,类那一行显示 implements。把枚举演示留在本页之外。把键盘输入留在本页之外。
本页为枚举留下什么
本页用 implements 填满接口方法。下一页讲枚举:一个类型列出一组固定的命名值。这里先留在接口承诺上。暂时不要把今天的演示换成 enum 列表作为要求。
以后使用枚举时,你仍可在同一程序的其他类型上实现接口。把本页当作那条相邻故事的接口半边。先把两个 Yard 演示练到 honk——以及随后的 honk 加 truck——感觉自然,再打开枚举课。
进入枚举之前
你可以写出带空 horn() 的 interface Signal,在 Truck 上实现它,并从 t.horn() 看到 honk。你可以在一个类上实现 Signal 和 Mark,看到先 honk 再 truck。对每个保留的演示依次编译 Yard.java 并运行 java Yard。类兑现了接口承诺。下一页是枚举:一个类型列出固定名称。
保留单接口的 honk 演示,讲清 implements。保留双接口演示,讲清逗号列表。把枚举文件留在本页之外。这三条习惯是继续前进前的检查点。当 t.horn() 之后出现 honk——并且第二个演示在 show() 之后也打印 truck——接口就完成本课任务,你已准备好进入下一主题:枚举。
最后再扫一遍文件夹:一个 public 的 Yard、带空方法的接口头、用 implements 兑现它们的类、不等待键盘、不强加 enum。对你打开的那个演示再跑一次 javac Yard.java 和 java Yard。若屏幕仍打印你写的接口填法,承诺就稳了,课程可以在下一页进入枚举。
🧠 测试您的知识
测试您的知识
通过这个互动测验挑战自己,看看你对这个主题的理解程度如何
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部