Java接口示例

时间:2020-02-23 14:37:10  来源:igfitidea点击:

在本教程中,将介绍如何创建和使用 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