java接口例子
“interface”(接口)要害字使抽象的观念更深入了一层。我们可将其想象为一个“纯”抽象类。它答允建设者划定一个类的根基形式:要领名、自变量列表以及返回范例,但不划定要领主体。接口也包括了根基数据范例的数据成员,但它们都默认为static和final。接口只提供一种形式,并不提供实施的细节。
接口这样描写本身:“对付实现我的所有类,看起来都应该象我此刻这个样子”。因此,回收了一个特定接口的所有代码都知道对付谁人接口大概会挪用什么要领。这即是接口的全部寄义。所以我们常把接口用于成立类和类之间的一个“协议”。有些面向工具的措施设计语言回收了一个名为“protocol”(协议)的要害字,它做的即是与接口沟通的工作。
为建设一个接口,请利用interface要害字,而不要用class。与类相似,我们可在interface要害字的前面增加一个public要害字(但只有接口界说于同名的一个文件内);可能将其省略,营造一种“友好的”状态。
为了生成与一个特定的接口(或一组接口)相符的类,要利用implements(实现)要害字。我们要表达的意思是“接口看起来就象谁人样子,这儿是它详细的事情细节”。除这些之外,我们其他的事情都与担任极为相似。下面是乐器例子的示意图:
详细实现了一个接口今后,就得到了一个普通的类,可用尺度方法对其举办扩展。
可抉择将一个接口中的要领声显着了界说为“public”。但即便不明晰界说,它们也会默认为public。所以在实现一个接口的时候,来自接口的要领必需界说成public。不然的话,它们会默认为“友好的”,并且会限制我们在担任进程中对一个要领的会见——Java编译器不答允我们那样做。
在Instrument例子的修改版本中,各人可明晰地看出这一点。留意接口中的每个要领都严格地是一个声明,它是编译器独一答允的。除此以外,Instrument5中没有一个要领被声明为public,但它们城市自动得到public属性。如下所示:
//: Music5.java // Interfaces 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 { // 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到底是个“普通”类、“抽象”类照旧一个“接口”。这是做是存心的:每种要领都使措施员能对工具的建设与利用举办差异的节制。