如您所知,Java 中的一切都由对象组成,对象具有状态(字段)和行为(由方法定义)。类的行为可以将其绑定到其他类。行为可以有不同的特征,有时将其移到类之外会更方便,尤其是在与外界交互时。就像电视的遥控器在“盒子”本身之外一样。遥控器是用户与电视功能交互的接口。例如,您可以想象一个实现抽象飞机或直升机的类。这两类物体(例如大多数鸟类)都可以飞行,而且它们的飞行方式都不同。也许值得将此功能转移到一个单独的实体中,并且所有潜在的“传单”都将从该实体继承?如果您已经熟悉抽象类,则可以创建一个抽象类 Flyable 并从中“继承”Copter 和 Plane 类。但是,如果有多个这样的属性怎么办?例如,飞机和直升机可以飞行,也可以在地面上行驶。即使我们创建了 Ride 类,我们也不能再将 Copter 和 Plane 分配给它。毕竟,每个Java类只有一个父类。
使用Java语言中的接口部分解决了这个问题。Java 中的接口定义了一些没有特定实现的功能,然后由使用这些接口的类来实现。并且一个类可以实现多个接口。事实上,通过在 Java 中实现一个接口,我们声明我们的类可以做某事,我们报告它的行为。我们已经在类中进行了行为的具体实现。所以。飞机和直升机的起飞方式不同:飞机需要跑道,而直升机通常垂直起飞。这些细节最好在课堂上实施。

Java 中的接口
在Java语言中定义接口需要使用interface关键字。例如:interface Voice {
void talk();
}
上面的接口称为Voice。Java 中的接口可以定义常量和方法,它们可能有也可能没有实现。通常,接口方法没有实现,就像本例中一样。接口中没有实现的方法就像抽象类的抽象方法。接口方法通常没有访问修饰符。然而,默认情况下访问实际上是公共的,因为接口的目的是定义类实现的功能。因此,所有功能都应该开放以供实施。要实现接口,请在声明类时使用Implements关键字。此外,如果接口包含没有实现的方法,则该方法必须在实现类中实现。
public class Duck implements Voice {
@Override
public void voice() {
System.out.println("Quack");
}
}
接口代码示例
让我们举一个更完整的例子。每一种(好吧,几乎每一种)动物都有发出声音的能力。让我们为此案例创建一个 Java 接口Voice 。它有一个talk()方法,但没有实现。public interface Voice {
void talk();
}
现在,所有支持Voice接口的类都必须具有talk()方法的实现。让我们创建两个类 - Cat和Dog并指示它们实现Voice接口。在这种情况下,如果你不在其中实现一个类,程序将无法运行。实现方法非常简单。当调用Cat类对象的talk()方法时,屏幕上将显示相当于喵叫的文本,对于Dog类,则为吠叫。我们还将向类添加 getter、setter 和构造函数。
public class Cat implements Voice {
String name;
String breed;
int year;
public Cat(String name, String breed, int year) {
this.name = name;
this.breed = breed;
this.year = year;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
@Override
public void talk() {
System.out.println("meow...");
}
}
public class Dog implements Voice {
String name;
String color;
int year;
public Dog(String name, String color, int year) {
this.name = name;
this.color = color;
this.year = year;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
@Override
public void talk() {
System.out.println("WOF WOF");
}
}
事实上,我们的类和方法实现非常相似。让我们创建另一个具有语音支持的类Parrot。只有talk()方法的工作方式有所不同:用户将在控制台中输入一个字符串,parrot 将使用 talk ()方法“重复”它。
import java.util.Scanner;
public class Parrot implements Voice {
String name;
String color;
int year;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
@Override
public void talk() {
Scanner scanner = new Scanner(System.in);
System.out.println("WHat should I repeat after you?...");
String s = scanner.nextLine();
System.out.println(s);
}
}
现在我们创建一个测试类,看看如果依次 调用Cat、Dog和Parrot类对象的talk()方法,程序会产生什么结果。
public class InterfaceDemo {
public static void main(String[] args) {
Cat cat = new Cat ("Mewie", "Siam" ,2021);
cat.talk();
Dog dog = new Dog("Snoopy", "White and black", 2020);
dog.talk();
Parrot parrot = new Parrot();
parrot.talk();
}
}
输出如下。绿色文本是用户在控制台中打印的一个文本。
喵...WOF WOF 我应该在你后面重复什么?...我是非常健谈和聪明的鸟 我是非常健谈和聪明的鸟
默认方法
在 JDK 8 版本之前,在用 Java 实现接口时,我们必须在类中实现其所有方法。同时,Java接口本身可以只包含方法定义,而没有具体的实现。JDK 8 添加了新功能——默认方法。现在,Java 接口不仅可以有方法定义,还可以有默认实现。如果类实现接口但未实现方法,则使用它们。例如,我们将Voice接口中的talk()方法更改为默认方法。我们还将编写一个新的支持语音的Duck类,该类没有talk方法的实现。public interface Voice {
default void talk() {
System.out.println("I can talk...");
}
}
public class Duck implements Voice {
public void moveForward() {
System.out.println(" Quack, I am moving forward...");
}
public void TurnRight(){
System.out.println("I am turning right...");
}
public void TurnLeft(){
System.out.println("I am turning left...");
}
public void Stop() {
System.out.println("Quack. I am relaxing on the surface of the water...");
}
public void fly(){
System.out.println("I am flying!!!");
}
}
现在让我们稍微改变一下我们的测试类。
public class InterfaceDemo {
public static void main(String[] args) {
Cat cat = new Cat ("Mewie", "Siam" ,2021);
cat.talk();
Dog dog = new Dog("Snoopy", "White and black", 2020);
dog.talk();
Duck duck = new Duck();
duck.talk();
}
}
输出在这里:
喵……WOF WOF 我会说话……
看?在Dog和Cat类的对象中,调用重写的方法talk() ,但在Duck类的对象中,调用接口中的默认方法。因此,default方法只是一个没有修饰符的方法,并用default关键字标记。我们不必在实现接口的类中实现默认方法,但我们可以重写它。
静态方法
由于 JDK 8 静态方法在 Java 接口中可用 - 它们类似于类方法:interface Voice {
void talk();
static void check(){
System.out.println("checked...");
}
}
要引用接口的静态方法,就像类的情况一样,写下接口的名称和方法:
public static void main(String[] args) {
Voice.check();
}
接口的多种实现
如果我们需要在Java类中应用多个接口,那么它们都在implements后面用逗号列出:public class Duck implements Swimmable, Flyable, Voice {
public void moveForward() {
System.out.println(" Quack, I am moving forward...");
}
public void TurnRight(){
System.out.println("I am turning right...");
}
public void TurnLeft(){
System.out.println("I am turning left...");
}
public void Stop() {
System.out.println("Quack. I am relaxing on the surface of the water...");
}
public void fly(){
System.out.println("I am flying!!!");
}
}
GO TO FULL VERSION