接口与多态

一、接口(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();
        }
}
}

QQ图片20160703112354.png

标签:

发表评论: