为什么是界面??????
它从一只狗开始。特别是哈巴狗。
哈巴狗有多种行为:
public class Pug {
private String name;
public Pug(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Arf!"; }
public boolean hasCurlyTail() { return true; } }
你有一只拉布拉多犬,它也有一套行为。
public class Lab {
private String name;
public Lab(String n) { name = n; }
public String getName() { return name; }
public String bark() { return "Woof!"; }
public boolean hasCurlyTail() { return false; } }
我们可以制作一些哈巴狗和实验室:
Pug pug = new Pug("Spot");
Lab lab = new Lab("Fido");
我们可以调用他们的行为:
pug.bark() -> "Arf!"
lab.bark() -> "Woof!"
pug.hasCurlyTail() -> true
lab.hasCurlyTail() -> false
pug.getName() -> "Spot"
假设我经营一个狗窝,我需要跟踪我所饲养的所有狗。我需要将我的哈巴狗和拉布拉多犬存放在单独的数组中:
public class Kennel {
Pug[] pugs = new Pug[10];
Lab[] labs = new Lab[10];
public void addPug(Pug p) { ... }
public void addLab(Lab l) { ... }
public void printDogs() { // Display names of all the dogs } }
但这显然不是最优的。如果我也想养一些贵宾犬,我必须更改我的犬舍定义以添加一组贵宾犬。事实上,我需要为每种狗创建一个单独的数组。
洞察力:哈巴狗和拉布拉多犬(和贵宾犬)都是狗的类型,它们具有相同的行为。也就是说,我们可以说(为了这个例子的目的)所有的狗都可以吠叫,有名字,可能有也可能没有卷曲的尾巴。我们可以使用一个接口来定义所有狗可以做什么,但是让特定类型的狗来实现这些特定的行为。界面说“这是所有狗都可以做的事情”,但没有说明每种行为是如何完成的。
public interface Dog
{
public String bark();
public String getName();
public boolean hasCurlyTail(); }
然后我稍微改变 Pug 和 Lab 类来实现 Dog 行为。我们可以说哈巴狗是狗,实验室是狗。
public class Pug implements Dog {
// the rest is the same as before }
public class Lab implements Dog {
// the rest is the same as before
}
我仍然可以像以前一样实例化 Pugs 和 Labs,但现在我也有了一种新的方法:
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
这表示 d1 不仅是一只狗,它特别是一只哈巴狗。d2 也是 Dog,特别是 Lab。我们可以调用这些行为,它们像以前一样工作:
d1.bark() -> "Arf!"
d2.bark() -> "Woof!"
d1.hasCurlyTail() -> true
d2.hasCurlyTail() -> false
d1.getName() -> "Spot"
这是所有额外工作都得到回报的地方。Kennel 类变得简单得多。我只需要一个数组和一个 addDog 方法。两者都适用于狗的任何物体;即实现 Dog 接口的对象。
public class Kennel {
Dog[] dogs = new Dog[20];
public void addDog(Dog d) { ... }
public void printDogs() {
// Display names of all the dogs } }
以下是如何使用它:
Kennel k = new Kennel();
Dog d1 = new Pug("Spot");
Dog d2 = new Lab("Fido");
k.addDog(d1);
k.addDog(d2);
k.printDogs();
最后一条语句将显示:Spot Fido
接口使您能够指定一组行为,实现该接口的所有类将共享这些行为。因此,我们可以定义变量和集合(例如数组),它们不必事先知道它们将保存什么样的特定对象,只需知道它们将保存实现接口的对象。