为什么要界面??????
它始于一条狗。特别是哈巴狗。
哈巴狗有多种行为:
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也是一只狗,特别是实验室。我们可以调用行为,它们将像以前一样工作:
d1.bark() -> "Arf!"
d2.bark() -> "Woof!"
d1.hasCurlyTail() -> true
d2.hasCurlyTail() -> false
d1.getName() -> "Spot"
这是所有额外工作的回报。狗窝类变得更加简单。我只需要一个数组和一个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
接口使您能够指定一组行为,所有实现该接口的类将共同共享一组行为。因此,我们可以定义变量和集合(例如数组),而不必事先知道它们将持有哪种特定对象,而只需要持有实现该接口的对象即可。