本节书摘来自异步社区《Android游戏开发详解》一书中的第3章,第3.3节接口,作者 【美】Jonathan S. Harbour,更多章节内容可以访问云栖社区“异步社区”公众号查看
3.3 接口
Android游戏开发详解
接下来,我们介绍一种方法,使用所谓的接口(interface),将对象分组为不同的类别。接口是一个抽象(abstract)的类别,它描述了属于该类别的对象的基本组成部分。为了更好地理解这一点,我们来学习一个实例。
接口和类相似,但是,它有一些显著的区别。如下所示是一个Human接口的样子。
程序清单3.8 Human接口
public interface Human {
public void eat();
public void walk();
public void urinate(int duration);
}
正如程序清单3.8所示,接口包含了各种抽象(abstract)的方法,它们没有方法体。这些没有方法体的抽象方法告诉我们,一个Human的对象分类必须能够做什么,但它们没有指定必须要如何实现这些操作。
为了说明接口实际上是什么,让我们先不要看代码。在你的脑海里,想象一下作为一个人类意味着什么(你不必变得太富有哲理)。接下来,我们看看如下的列表,告诉我是否每个人都满足你对于人类的看法:你的邻居、你最好的朋友和你自己。
对于所有这些人,你可能会回答是的。这是因为,当我们让你想一下对人类的看法的时候,你不会认为这是某一个个别的人。相反,你会形成某种规则,即一个人如何与他的世界交互,并且使用这种思路来判定不同人的人类特性。
接口大体上也是如此。程序清单3.8中的Human接口,不是用来创建单个的Human对象的。相反,它定义了一个交互的模式,阐述了一个Human对象在你的程序中应该具有什么样的行为。它提供了一组基本的要求,如果要创建Human类型的更多的具体版本(如King类)的话,必须要满足这些需求,如程序清单3.9所示。
程序清单3.9 King类
public class King implements Human {
public void eat() {
System.out.println("The King eats.");
}
public void walk() {
System.out.println("The King walks.");
}
public void urinate(int duration) {
System.out.println("The King urinates for " + duration + " minutes.");
}
public void rule() {
System.out.println("The King reigns.");
}
}
研究一下King类和Human接口之间的关系,你会注意到一些事情。首先,King类声明了它实现了Human接口,作为程序员,我们就是这样指定想要让King类属于Human这个分类的。其次,King类声明了程序清单3.8中给出的Human接口中的所有3个方法,并且这个类为这些前面的抽象方法中的每一个都提供了一个具体的方法体。第三,King类有一个额外的名为rule()的方法,这将其与泛型的Human区分开来。
接口是一系列的协议。如果选取了一个对象来实现一个接口,该对象同意实现接口中的每一个抽象方法。这意味着什么呢?这意味着,一个King对象,不管他想要保持多么神秘,都必须实现所有的Human接口的抽象方法,包括urinate()方法,因为国王毕竟也是人。如果不满足这一需求,愤怒的JVM将会向他显示红色的错误消息。