Java接口示例
在本教程中,将介绍如何创建和使用 Java接口。一如既往,我将演示一个Java接口的实际示例。
什么是Java接口?
与许多其他Java概念一样,接口是从真实场景中派生出来的,其主要目的是通过严格的规则使用对象。例如,如果你想打开洗衣机洗衣服,你需要按启动按钮。这个按钮是你和洗衣机内部电子设备之间的接口。Java接口有相同的行为:它们对如何与对象交互设置严格的规则。要想了解更多关于Java对象的信息,请阅读本教程。
Java接口表示一组具有空主体的方法。好吧,在一个接口中有一个完整的方法列表不是强制性的——它们可以是0个或者更多……但是,不管方法的数量是多少,它们都应该是空的。
创建接口
使用洗衣机的示例,让我们创建一个名为
WashingMachine
用一种方法
startButtonPressed()
public interface WashingMachine { public void startButtonPressed(); }
这就是定义接口所需的全部内容。注意关键字的用法
interface
. 方法
startButtonPressed()
没有尸体。当然,我们也可以使用具有以下返回类型和参数的方法:
public int changeSpeed(int speed);
如何实现接口
现在我们将创建一个 实现我们的接口的类。为了继续这个例子,我们将创建一个具有启动按钮的特定品牌的洗衣机。
public class SamsungWashingMachine implements WashingMachine { @Override public void startButtonPressed() { System.out.println("The Samsung washing machine is now running."); } }
我们使用
implements
类声明中的关键字。我们需要实现startButtonPressed方法(给它一些功能),否则我们的类将无法编译。
请注意,我们可以在一个类中实现多个接口。我们只需在类声明中用逗号分隔接口名,如下所示:
public class SamsungWashingMachine implements WashinMachine, Serializable, Comparable<WashinMachine> { ... }
测试你的接口
现在让我们创建一个小程序来测试我们的接口和实现
public class Test { public static void main(String[] args) { WashinMachine samsungWashinMachine = new SamsungWashingMachine(); samsungWashinMachine.startButtonPressed(); } }
程序的输出将是:
The Samsung washing machine is now running.
使用接口来声明特定的对象特征
Java中还有一种常见的接口用法,即告诉对象具有特定的用途或者特性。
让我们再举一个真实世界的例子。你是树林里的幸存者。你找到不同的东西,然后把它们放在你的背包里以备以后使用。当你休息的时候,你会仔细检查找到的东西,吃一次可以吃的东西。
首先,让我们定义一个名为
FoundObject
完全没有方法。这些都是我们在树林里发现的东西:
public interface FoundObject { }
现在我们定义第二个接口
Eatable
. 我们用它来表示这个物体是否可以吃
public interface Eatable { public void eat(); }
通过以下三个类,我们将定义我们在树林中发现的物体——苹果、覆盆子和石头
public class Apple implements FoundObject, Eatable { private String name; public Apple(String name) { this.name = name; } @Override public void eat() { System.out.println("Yummy! you eat some " + this.name); } }
public class Raspberry implements FoundObject, Eatable { private String name; public Raspberry(String name) { this.name = name; } @Override public void eat() { System.out.println("Yummy! you eat some " + this.name); } }
public class Stone implements FoundObject { private String name; public Stone(String name) { this.name = name; } }
现在让我们编写生存程序。我们会把找到的东西放在背包(阵列)里,然后试着吃掉它们
public class WoodsSurvival { public static void main(String[] args) { //create an array of type FoundObject FoundObject backpack [] = new FoundObject[3]; //create the objects we found in the woods FoundObject apple = new Apple("apple"); FoundObject stone = new Stone("stone"); FoundObject raspberry = new Raspberry("raspberry"); //add the found objects to the backpack backpack[0] = apple; backpack[1] = stone; backpack[2] = raspberry; //iterate over the found objects for (int i=0; i<backpack.length; i++) { FoundObject currentObject = backpack[i]; //check if object is eatable if (currentObject instanceof Eatable) { //cast the object to eatable and execute eat method ((Eatable) currentObject).eat(); } } } }
程序的输出为:
Yummy! you eat some apple Yummy! you eat some raspberry
代码说明
首先我们创建接口
FoundObject
唯一的目的是表示特定类型的对象,因此我们可以将它们放在同一个数组中。我们创造了
Eatable
接口来标记哪些对象可以被吃掉。
当我们创建三个对象(苹果、覆盆子和石头)时
implements FoundObject
在类声明中为它们所有,并且一个我们可以吃的也实现了
Eatable
接口。
在
WoodsSurvival
类我们首先创建一个
FoundObject
. 我们稍后创建的三个对象也是类型
FoundObject
所以我们可以把它们放在同一个数组中。按照本文了解有关Java数组的更多信息。
当我们迭代数组时,我们检查当前对象的类型是否为
Eatable
. 我们在
instanceof
凯福德。
instanceof
如果两个对象属于同一类型,则返回true。在我们的例子中,苹果和覆盆子将返回真值
instanceof Eatable
,因为两者都实现了
Eatable
接口。能够执行
eat()
方法将对象显式类型转换为
Eatable
第一。我们通过以下代码行实现这一点:
((Eatable) currentObject).eat();
我们不能执行石头对象的吃法,因为它不是类型
Eatable