接口--interface

“interface”(接口)关键字使抽象的概念更深刻了一层。咱们可将其想象为一个“纯”抽象类。它容许创
建者规定一个类的基本形式:方法名、自变量列表以及返回类型,但不规定方法主体。接口也包含了基本数
据类型的数据成员,但它们都默认为static 和final。接口只提供一种形式,并不提供实施的细节。
接口这样描述本身:“对于实现个人全部类,看起来都应该象我如今这个样子”。所以,采用了一个特定接
口的全部代码都知道对于那个接口可能会调用什么方法。这即是接口的所有含义。因此咱们常把接口用于建
立类和类之间的一个“协议”。有些面向对象的程序设计语言采用了一个名为“protocol”(协议)的关键
字,它作的即是与接口相同的事情。
为建立一个接口,请使用interface 关键字,而不要用class。与类类似,咱们可在interface 关键字的前
面增长一个public 关键字(但只有接口定义于同名的一个文件内);或者将其省略,营造一种“友好的”状
态。
为了生成与一个特定的接口(或一组接口)相符的类,要使用implements(实现)关键字。咱们要表达的意
思是“接口看起来就象那个样子,这儿是它具体的工做细节”。除这些以外,咱们其余的工做都与继承极为
类似。下面是乐器例子的示意图:java


具体实现了一个接口之后,就得到了一个普通的类,可用标准方式对其进行扩展。
可决定将一个接口中的方法声明明肯定义为“public”。但即使不明肯定义,它们也会默认为public。因此
在实现一个接口的时候,来自接口的方法必须定义成public。不然的话,它们会默认为“友好的”,并且会
限制咱们在继承过程当中对一个方法的访问——Java 编译器不容许咱们那样作。
在Instrument 例子的修改版本中,你们可明确地看出这一点。注意接口中的每一个方法都严格地是一个声明,
它是编译器惟一容许的。除此之外,Instrument5 中没有一个方法被声明为public,但它们都会自动得到
public 属性。以下所示:程序员

//: Music5.java
// Interfaces
173
import java.util.*;
interface Instrument5 {
// Compile-time constant:
int i = 5; // static & final
// Cannot have method definitions:
void play(); // Automatically public
String what();
void adjust();
}
class Wind5 implements Instrument5 {
public void play() {
System.out.println("Wind5.play()");
}
public String what() { return "Wind5"; }
public void adjust() {}
}
class Percussion5 implements Instrument5 {
public void play() {
System.out.println("Percussion5.play()");
}
public String what() { return "Percussion5"; }
public void adjust() {}
}
class Stringed5 implements Instrument5 {
public void play() {
System.out.println("Stringed5.play()");
}
public String what() { return "Stringed5"; }
public void adjust() {}
}
class Brass5 extends Wind5 {
public void play() {
System.out.println("Brass5.play()");
}
public void adjust() {
System.out.println("Brass5.adjust()");
}
}
class Woodwind5 extends Wind5 {
public void play() {
System.out.println("Woodwind5.play()");
}
public String what() { return "Woodwind5"; }
}
public class Music5 {
174
// Doesn't care about type, so new types
// added to the system still work right:
static void tune(Instrument5 i) {
// ...
i.play();
}
static void tuneAll(Instrument5[] e) {
for(int i = 0; i < e.length; i++)
tune(e[i]);
}
public static void main(String[] args) {
Instrument5[] orchestra = new Instrument5[5];
int i = 0;
// Upcasting during addition to the array:
orchestra[i++] = new Wind5();
orchestra[i++] = new Percussion5();
orchestra[i++] = new Stringed5();
orchestra[i++] = new Brass5();
orchestra[i++] = new Woodwind5();
tuneAll(orchestra);
}
} ///:~
代码剩余的部分按相同的方式工做。咱们能够自由决定上溯造型到一个名为Instrument5 的“普通”类,一
个名为Instrument5 的“抽象”类,或者一个名为Instrument5 的“接口”。全部行为都是相同的。事实
上,咱们在tune()方法中能够发现没有任何证据显示Instrument5 究竟是个“普通”类、“抽象”类仍是一
个“接口”。这是作是故意的:每种方法都使程序员能对对象的建立与使用进行不一样的控制。
相关文章
相关标签/搜索