15.md 6.7 KB
Newer Older
W
init  
wizardforcel 已提交
1 2 3 4 5 6
# Java 接口示例

> 原文: [https://javatutorial.net/java-interface-example](https://javatutorial.net/java-interface-example)

在本教程中,我将向您展示如何创建和使用 **Java 接口**。 与往常一样,我将演示 Java 接口的实际示例。

W
wizardforcel 已提交
7
![](img/bd9a26ffe0204dc0807b7a7d3d1f5e3f.jpg)
W
init  
wizardforcel 已提交
8 9 10 11 12 13 14

## 什么是 Java 接口?

与许多其他 Java 概念一样,接口是从真实场景中派生而来的,其主要目的是按照严格的规则使用对象。 例如,如果您想打开洗衣机来洗衣服,则需要按开始按钮。 此按钮是您与洗衣机内部电子设备之间的接口。 Java 接口具有相同的行为:它们对如何与对象进行交互设置了严格的规则。 要查找有关 [Java 对象的更多信息,请阅读本教程](https://javatutorial.net/java-objects-and-classes-tutorial)

Java 接口表示一组带有空主体的方法。 嗯,在接口中包含完整的方法列表不是强制性的-它们可以为 0 或更多…但是,无论方法的数量如何,它们都应该为空。

W
wizardforcel 已提交
15
## 创建一个接口
W
init  
wizardforcel 已提交
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

以洗衣机为例,使用一种方法`startButtonPressed()`创建一个名为`WashingMachine`的接口

```java
public interface WashingMachine {	
	public void startButtonPressed();
}
```

定义接口就这些了。 注意关键字`interface`的用法。 方法`startButtonPressed()`没有正文。 它以结尾; 当然,您也可以使用具有返回类型和参数的方法,例如:`public int changeSpeed(int speed);`

## 如何实现接口

现在,我们将创建一个**实现我们的接口**的类。 继续该示例,我们将创建具有“开始”按钮的特定品牌的洗衣机。

```java
public class SamsungWashingMachine implements WashingMachine {

	@Override
	public void startButtonPressed() {
		System.out.println("The Samsung washing machine is now running.");
	}

}
```

W
wizardforcel 已提交
42
我们在类声明中使用`implements`关键字。 我们需要实现`startButtonPressed`方法(为它提供一些功能),否则我们的类将无法编译。
W
init  
wizardforcel 已提交
43 44 45 46 47 48 49

请注意,您可以在一类中实现多个接口。 您只需要在类声明中用逗号分隔接口名称,如下所示:

```java
public class SamsungWashingMachine implements WashinMachine, Serializable, Comparable<WashinMachine> { ... }
```

W
wizardforcel 已提交
50
## 测试你的接口
W
init  
wizardforcel 已提交
51

W
wizardforcel 已提交
52
现在让我们创建一个小程序来测试我们的接口和实现
W
init  
wizardforcel 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138

```java
public class Test {
	public static void main(String[] args) {
		WashinMachine samsungWashinMachine = new SamsungWashingMachine();
		samsungWashinMachine.startButtonPressed();
	}
}
```

该程序的输出将是:

```java
The Samsung washing machine is now running.
```

## 使用接口声明特定的对象特征

Java 接口还有另一种常见用法-告诉对象具有特定用途或特征。

让我们再举一个真实的例子。 你是在树林里生存。 您会发现其他物体,并将它们放在背包中以备后用。 休息时,您会浏览找到的物体并食用一次可食用的物体。

首先,让我们定义一个根本没有方法的名为`FoundObject`的接口。 这些都是我们在树林里发现的物体:

```java
public interface FoundObject {

}
```

现在我们定义第二个接口`Eatable`。 我们将仅使用它来表示对象是否可食用

```java
public interface Eatable {
	public void eat(); 
}
```

通过以下三个类,我们将定义我们在树林中找到的对象–苹果,树莓和石头

```java
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);
	}

}
```

```java
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);
	}

}
```

```java
public class Stone implements FoundObject {

	private String name;

	public Stone(String name) {
		this.name = name;
	}

}
```

W
wizardforcel 已提交
139
现在让我们编写生存程序。 我们将在背包(数组)中收集找到的物品,并尝试吃掉它们
W
init  
wizardforcel 已提交
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181

```java
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();
			}
		}

	}

}
```

该程序的输出为:

```java
Yummy! you eat some apple
Yummy! you eat some raspberry
```

**代码说明了**

W
wizardforcel 已提交
182
首先,我们创建接口`FoundObject`的唯一目的是表示特定类型的对象,因此我们可以将它们放在同一数组中。 我们创建`Eatable`接口以标记可以食用的对象。
W
init  
wizardforcel 已提交
183 184 185 186 187

当我们创建三个对象(苹果,树莓和石头)时,我们将所有对象的类都声明为`implements FoundObject`,而我们可以食用的对象也实现了`Eatable`接口。

`WoodsSurvival`类中,我们首先创建一个`FoundObject`类型的数组。 我们稍后创建的三个对象的类型也都是`FoundObject`,因此我们可以将它们放在同一数组中。 关注本文,以了解有关 [Java 数组](https://javatutorial.net/java-array)的更多信息。

W
wizardforcel 已提交
188
迭代数组时,我们检查当前对象是否为`Eatable`类型。 我们在`instanceof keyford`的帮助下进行此操作。 如果两个对象属于同一类型,则`instanceof`返回`true`。 在我们的案例中,使用`instanceof Eatable`进行检查时,苹果和树莓将返回 true,因为两者均实现了`Eatable`接口。 为了能够执行`eat()`方法,我们需要首先将对象显式类型转换为`Eatable`。 我们使用以下代码行实现此目的:
W
init  
wizardforcel 已提交
189 190 191 192 193

```java
((Eatable) currentObject).eat();
```

W
wizardforcel 已提交
194
我们无法执行石头对象的`eat`方法,因为它不是`Eatable`类型。
W
init  
wizardforcel 已提交
195

W
wizardforcel 已提交
196
## 结论
W
init  
wizardforcel 已提交
197 198

可以使用[抽象类](https://javatutorial.net/java-abstraction-example)[集合](https://javatutorial.net/java-collection-tutorial)[继承](https://javatutorial.net/java-inheritance-example)以更时髦的方式编写上面的代码示例。 其中一些是更高级的主题,将在下一个教程中进行说明。 这是一个初学者教程,旨在仅说明 Java 接口。