一、接口(interface)使抽象的概念更深入一层。可将其想象为一个“纯”抽象类。它允许创建者规定一个类的基本形式:方法名、自变量列表以及返回类型,但不规定方法主体。接口也包含了数据成员,但它们都默认为static和final。接口只提供一种形式,并不提供实施的细节。
1、接口的作用,为了实现多继承,同时免除C++中的多继承那样的复杂性。接口中的所有方法都是抽象的,这些抽象方法由实现这一接口的不同类来具体完成。在使用中,接口类的变量可以用来代表任何实现了该接口的类的对象。这样可以最大限度地利用动态绑定,隐藏实现细节。接口还可以用来实现不同类之间的常量共享。人们常使用接口来建立类和类之间的“协议”。接口(interfaces)与抽象类(abstract classes)都是声明多个类的共同属性。与抽象类不同的是:接口允许在看起来不相干的类之间定义共同行为。
2、接口的语法,java接口中只声明类中方法的原型,而没有直接定义方法的内容。其声明格式为:
[接口修饰符] interface 接口名称 [<Type {,Type}>] [extends 父类名] { ……//方法的原型声明或静态常量 }
接口与一般类一样,本身也具有数据成员与方法,但数据成员一定要赋予初值,且此值将不能再更改,而方法必须是“抽象方法”。接口在声明时也可以声明是泛型接口,其格式是在接口名称后加上“<Type>”。
3、接口的实现:必须利用接口的特性来构造新的类,然后再用它来创建对象。即利用接口构造类。为了生成与一个特定的接口(或一组接口)相符的类,要使用implements(实现)关键字:
[类修饰符] class 类名称 implements 接口名称{ /* Bodies for the interface methods */ /* Own data and methods. */ }
完成接口的类必须实现接口中的所有抽象方法,注意在实现一个接口的时候,来自接口的方法必须声明成public。
4、多重继承,Java允许一个类可以实现多个接口,通过这种机制可以实现多重继承。一个类实现多个接口的语法如下:
[类修饰符] class 类名称 implements 接口1,接口2,…… {……}
如果实现接口的类为非抽象类,则在类中要实现每一个接口中的所有抽象方法。
二、多态:将一条消息发给对象时,可能并不知道运行时对象的具体类型会是什么,但采取的行动同样是正确的,这种情况就叫做“多态性”(Polymorphism)。多态性是指不同类型的对象可以响应相同的消息。
绑定:将一个方法调用同一个方法主体连接到一起就称为“绑定”(Binding)。根据绑定的时期不同,可将绑定分为“早期绑定”及“后期绑定”两种。若在程序运行以前执行绑定(由编译器和链接程序,如果有的话),就叫做“早期绑定”。如果绑定在运行期间进行,就称为“后期绑定”。后期绑定也叫做“动态绑定”或“运行期绑定”。
//基类Shape建立了一个通用接口,也就是说,所有(几何)形状都可以描绘和删除 class Shape{ void draw(){ } void erase(){ } } //派生类覆盖了draw方法,为每种特殊类型的几何形状都提供了独一无二的行为 class Circle extends Shape{ @ Override //@override注解,表示覆盖父类方法 void draw(){ System.out.println("Circle.draw()"); } @ Override void erase(){ System.out.println("Circle.erase()"); } } class Square extends Shape{ @ Override void draw(){ System.out.println("Square.draw()"); } @ Override void erase(){ System.out.println("Square.erase()"); } } class Triangle extends Shape{ @ Override void draw(){ System.out.println("Triangle.draw()"); } @ Override void erase(){ System.out.println("Triangle.erase()"); } } //下面对动态绑定进行测试 public class BindingTester { public static void main(String[] args){ Shape[] shape=new Shape[9]; int n; for (int i=0;i<shape.length;i++){ n=(int) (Math.random()*3); switch (n){ case 0: shape[i]=new Circle(); break; case 1: shape[i]=new Square(); break; case 2: shape[i]=new Triangle(); } } for (Shape oneS:shape){ //增强for循环,应在JDK 5及其以上版本运行 oneS.draw(); } } }
发表评论: