Java教程各种接口的介绍

Interfaces 接口
在软件工程中,由一份“契约”规定来自不同的开发小组的软件之间如何相互作用是非常常见的。每个小组都可以在不知道别的组的代码的前提下独立开发自己的代码。Java中的interface就是这样的一份“契约”。
举个例子,假设在未来社会有一种智能汽车,它可以在自动运载旅客而不需要人工操作。汽车生产商开发了软件(当然是用Java)来控制这种汽车停止,发动,加速,左转等等。电子导航仪器生产商负责开发接受GPS位置数据和交通状况无线传输的电脑系统,并且应用这些信息来驾驶汽车。
汽车生产商必须公布工业标准interface,该interface需详细解释哪些methods可以用于控制汽车运动(该标准适用于任何汽车,任何生产商)。导航系统生产商就可以应用这个interface所介绍的各种methods来控制汽车。任何一个工业厂商都不需了解其他厂商是如何实现他们的软件的。事实上,只要大家都严格遵守所公布的interface,每个厂商对其自己的软件都有高度所有权,并且保有随时修改的权利。
在java中的interface
在java编程语言里,一个interface是引用类型(reference),它与class相似,因此只能包含常量(constants),方法签名(method signatures)和嵌套类型(nested types)。Interface不得含有方法的具体代码(method body)。 Interface 不可被实例化(instantiated),只能被其它class实现(implemented)或者被其它interface继承。
定义一个interface与创建一个新类类似:


代码如下:

public interface OperateCar { 
// constant declarations, if any 
// method signatures 
// An enum with values RIGHT, LEFT 
   int turn(Direction direction, 
            double radius, 
            double startSpeed, 
            double endSpeed); 
   int changeLanes(Direction direction, 
                   double startSpeed, 
                   double endSpeed); 
   int signalTurn(Direction direction, 
                  boolean signalOn); 
   int getRadarFront(double distanceToCar, 
                     double speedOfCar); 
   int getRadarRear(double distanceToCar, 
                    double speedOfCar); 
         …… 
   // more method signatures 
}

如想使用上面这个interface,你需要写一个class来实现它。当一个可被实例化的class实现某个接口时,它需要提供所有该interface所声明的所有方法(methods)的具体代码。
在上面的自动化汽车的例子中,汽车生产商即是接口实现者。由雪佛兰公司的实现方法当然不同于本田公司的方法,但是它们都遵循同一个接口。 导航系统生产商是这个接口的使用者,他们的系统将根据汽车方位的GPS数据,数字化地图和交通情况来驾驶汽车。因此,这个导航系统将会涉及以下的方法(methods): 转弯,切道,刹车,加速等等。
API 接口
自动化汽车的例子展示了interface在工业标准应用程序接口(API, Application Programming Interface)中的应用. 在商业软件中,API也很常见。 通常来说, 一个公司发售的软件包中会含有其他公司希望应用在自己的产品中的复杂方法(methods)。比如一个包含了数字图形处理方法的软件包就可以出售给开发终端客户图像软件的公司。购买后,该公司就可以应用interface所定义的方法。当图像处理公司向所有客户公开它的API的同时,这些API的实现方法是高度保密的。事实上,只要保留住原始的interface不被改变,这些API的实现方法很可能在将来被重写。
Interfaces 和多重继承
在java编程语言里,interface还有另外一个重要作用。 尽管Interface是与类一起使用的,但它并不是类的层次结构的一部分。java编程语言不支持多重继承,但是interface提供了替代方案。
在java中,一个类只能继承于单一的类,但是它可以实现多个接口。因此,对象可以有多重类型:属于它自身类的类型,和属于它所继承的所有接口的类型。这意味着,如果声明一个变量是某个接口类型,这个变量可以指代任何实现该接口的类的实例。这部分会在“使用接口类型”中详细讨论。
定义一个interface
一个接口的定义是由 修饰词(modifiers),关键词 interface, 接口名称,由逗号分隔开的父接口(parent interfaces),和接口实体(interface body)。
例子如下:


代码如下:

public interface GroupedInterface extends Interface1, Interface2, Interface3 { 
// constant declarations 
// base of natural logarithms 
    double E = 2.718282; 
// method signatures  
    void doSomething (int i, double x); 
    int doSomethingElse(String s); 
}

Public规定了这个接口可以被任何包中的任何类所使用。如果你声明这个接口是public的,它只能被同一个包里的类所使用。
一个接口可以继承其它接口,就像一个类能后继承其它类一样。但是类只能继承一个父类,而接口却可以继承任何数目的接口。
接口实体(interface body)
接口实体中含有它所包含的所有方法的声明。每个声明都以引号为结束,因为接口不用实现它所声明的方法。接口中所有的方法都默认是public的,因此修饰词public可以被省略。
接口还可以声明常量。同样的,常量的修饰词public, static和final可以被省略。
接口的实现
为了声明某个类实现了某个接口,你需要在类的声明中使用implements。你的类可以实现多个接口,所以implements关键词后面可以跟随多个由逗号分隔的接口名称。为了方便,implements关键词多跟在extends关键词的后面。
一个接口实例—Relatable
Relatable是一个用来比较两个对象大小的接口。


代码如下:

public interface Relatable { 
    // this (object calling isLargerThan) 
    // and other must be instances of  
    // the same class returns 1, 0, -1  
    // if this is greater // than, equal  
    // to, or less than other 
    public int isLargerThan(Relatable other); 
}

如果你想比较两个相似的对象的大小,不管该对象属于什么类,这个类需要实现Relatable接口。
只要有办法可以比较对象的相对大小,任何类都可以实现Relatable接口。对字符串来说,可以比较字符数;对书来说,可以比较页数;对学生来说,可以比较体重。对平面几何对象来说,比较面积是很好的选择;对三维对象来说,就需要比较体积了。所有以上的类都能实现int isLargerThan()方法。
如果你知道某个类实现了Relatable接口,你可以比较从这个类实例化的对象了。
Relatable接口的实现
下面是一个三角形类,它实现了Relatable接口。


代码如下:

public class RectanglePlus 
    implements Relatable { 
    public int width = 0; 
    public int height = 0; 
    public Point origin; 
    // four constructors 
    public RectanglePlus() { 
        origin = new Point(0, 0); 
    } 
    public RectanglePlus(Point p) { 
        origin = p; 
    } 
    public RectanglePlus(int w, int h) { 
        origin = new Point(0, 0); 
        width = w; 
        height = h; 
    } 
    public RectanglePlus(Point p, int w, int h) { 
        origin = p; 
        width = w; 
        height = h; 
    } 
    // a method for moving the rectangle 
    public void move(int x, int y) { 
        origin.x = x; 
        origin.y = y; 
    } 
    // a method for computing 
    // the area of the rectangle 
    public int getArea() { 
        return width * height; 
    } 
    // a method required to implement 
    // the Relatable interface 
    public int isLargerThan(Relatable other) { 
        RectanglePlus otherRect  
            = (RectanglePlus)other; 
        if (this.getArea() < otherRect.getArea()) 
            return -1; 
        else if (this.getArea() > otherRect.getArea()) 
            return 1; 
        else
            return 0; 
    } 
}

使用接口类型
在你定义一个新的接口时,你其实在定义一个新的引用类型。在你能使用数据类型名称的地方,都可以使用接口名称。如果你定义了一个类型为接口的引用变量,该变量能指向的对象所在的类必须实现了该接口。
下例是一个在一对对象中返回较大对象的方法:


代码如下:

public Object findLargest(Object object1, Object object2) { 
   Relatable obj1 = (Relatable)object1; 
   Relatable obj2 = (Relatable)object2; 
   if ((obj1).isLargerThan(obj2) > 0) 
      return object1; 
   else
      return object2; 
}

通过把数据类型object1转换成Relatable,对象obj1可以调用isLargerThan方法。
同理,只要是实现了Relatable的类,也可以使用下面的方法。


代码如下:

public Object findSmallest(Object object1, Object object2) { 
   Relatable obj1 = (Relatable)object1; 
   Relatable obj2 = (Relatable)object2; 
   if ((obj1).isLargerThan(obj2) < 0) 
      return object1; 
   else
      return object2; 

public boolean isEqual(Object object1, Object object2) { 
   Relatable obj1 = (Relatable)object1; 
   Relatable obj2 = (Relatable)object2; 
   if ( (obj1).isLargerThan(obj2) == 0) 
      return true; 
   else
      return false; 
}

这些方法适用于任何“Relatable”的类,而无关它们的继承关系。实现了Relatable的类,它们既属于自身(或者父类)的类型,也属于Relatable类型。这使得它们具有了多重继承的优点,因为它们可以同时具备父类和接口的行为。
重写接口
假设你开发了一个接口名为DoIt:


代码如下:

public interface DoIt { 
   void doSomething(int i, double x); 
   int doSomethingElse(String s); 
}

然后,你想加入一个新的方法在这个接口里,因此代码变成:


代码如下:

public interface DoIt { 
   void doSomething(int i, double x); 
   int doSomethingElse(String s); 
   boolean didItWork(int i, double x, String s); 
}

如果你这么修改了,所有实现了旧的DoIt接口的类都会出错,因为它们不再正确的实现这个接口。所有使用这个接口的程序员会严重抗议你的修改。
你需要预估你的接口用户的需求,并从开始就完善的设计好这个接口。但是这常常是无法做到的。另一个解决方法就是再写一个接口。例如,你可以写一个DoItPlus的接口继承原有的接口。


代码如下:

public interface DoItPlus extends DoIt { 
   boolean didItWork(int i, double x, String s); 
}

现在你的用户可以选择继续使用旧接口DoIt,或是升级的新接口DoItPlus。
总结
接口就是两个对象间的沟通协议。
一个接口的声明包含一些方法的签名(signatures),但不需要实现它们;也可能含有一些常量。
实现某接口的类必须实现该接口所声明的所有的方法。
在任何使用类型名称的地方都可以使用接口的名字。
英文原文;Oracle,编译:@philhu

几招防范Java漏洞
Java异常处理
经过糟糕一年后,Java正沿着正确方向发展
Java枚举的七种常见用法
选择Java还是.NET

(0)

相关推荐

  • 深入解析Java接口(interface)的使用

    Java接口(interface)的概念及使用 在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加"抽象". 接口使用 interface 关键字来声明,可以看做是一种特殊的抽象类,可以指定一个类必须做什么,而不是规定它如何去做. 现实中也有很多接口的实例,比如说串口电脑硬盘,Serial ATA委员会指定了Serial ATA 2.0规范,这种规范就是接口.Serial ATA委员会不负责生产硬盘,只是指定

  • java中set接口使用方法详解

    java中的set接口有如下的特点: 不允许出现重复元素: 集合中的元素位置无顺序: 有且只有一个值为null的元素. 因为java中的set接口模仿了数学上的set抽象,所以,对应的数学上set的特性为: 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次. 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的.集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序.但就集合本身的特性而言,元素之间没有必然的序. 空集的性质:空集是一切集合的子集 S

  • JAVA 继承基本类、抽象类、接口介绍

    封装:就是把一些属性和方法封装到一个类里. 继承:就如子类继承父类的一些属性和方法. 多态:就如一个父类有多个不同特色的子类. 这里我就不多讲解,下面我主要说明一个继承.继承是OOP(面向对象)的一个特色,java只支持单继承(如果继承两个有同样方法的父类,那么就不知道继承到那个父类的,所以java只支持单继承).继承是java的一个特色,我们用的所以类都继承Objict类,所以就要Object类的方法,如toString().getClass().wait()--所以我们建立的类都有父类. J

  • Java基础教程之封装与接口

    总结之前的内容,对象(object)指代某一事物,类(class)指代象的类型.对象可以有状态和动作,即数据成员和方法. 到现在为止,数据成员和方法都是同时开放给内部和外部的.在对象内部,我们利用this来调用对象的数据成员和方法.在对象外部,比如当我们在另一个类中调用对象的时,可以使用 对象.数据成员 和 对象.方法() 来调用对象的数据成员和方法. 我们将要封装(encapsulation)对象的成员(成员包括数据成员和方法),从而只允许从外部调用部分的成员.利用封装,我们可以提高对象的易用

  • Java接口定义与实现方法分析

    本文实例讲述了Java接口定义与实现方法.分享给大家供大家参考,具体如下: 在java中,我们可以通过继承得到另一个类中的方法,但是这个仅仅满足继承一个方法,那有办法可以多个继承不,就好比,我们人类的基因,总有一部分是继承爸爸,一部分是继承妈妈,而java中有是单继承,那我们怎么办解决?java中就用接口的方式来解决,实现接口,就可以实现所谓的多继承 什么是接口? 一个Java 接口(interface)是一些方法特征的集合,这些方法特征来自于具体方法,这些方法符合它们一般来自于一些在系统中不断

  • java自定义注解接口实现方案

    java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annotation 包中. 1.元注解 元注解是指注解的注解.包括 @Retention @Target @Document @Inherited四种. 1.1.@Retention: 定义注解的保留策略 Java代码 复制代码 代码如下: @Retention(RetentionPolicy.SOURCE

  • Java中接口和抽象类的区别与相同之处

    1. 抽象类: (1).概念:抽象类是对一种事物的抽象,即对类抽..抽象类是对整个类整体进行抽象,包括属性.行为.Java抽象类和Java接口一样,都用来声明一个新的类型.并且作为一个类型的等级结构的起点. (2).格式: 复制代码 代码如下: public abstract class abstractDemo{             /**属性*/             private String name;             /**方法*/             public

  • Java通过接口实现匿名类的实例代码

    复制代码 代码如下: package com.chase.test; /** * 通过接口实现匿名类的实例 *  * @author Chase *  * @date 2013-10-18 下午04:28:17  * * @version V1.0 */interface I1 {    void print();    void eat();} public class AnonymousClass { public static String excute(I1 c){        Sys

  • Java接口和抽象类用法实例总结

    本文实例讲述了Java接口和抽象类用法.分享给大家供大家参考,具体如下: 接口 1 因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但可以实现多个接口,接口本身也可以继承多个接口. 2 接口里面的成员变量默认都是public static final类型的.必须被显示的初始化. 3 接口里面的方法默认都是public abstract类型的.隐式声明. 4 接口没有构造方法,不能被实例化. 5 接口不能实现另一个接口,但可以继承多个接口. 6 类如果实现了一个接口,那么必须实现

  • java用接口、多态、继承、类计算三角形和矩形周长及面积的方法

    本文实例讲述了java用接口.多态.继承.类计算三角形和矩形周长及面积的方法.分享给大家供大家参考.具体如下: 定义接口规范: /** * @author vvv * @date 2013-8-10 上午08:56:48 */ package com.duotai; /** * * */ public interface Shape { public double area(); public double longer(); } /** * @author vvv * @date 2013-8

  • Java程序连接数据库的常用的类和接口介绍

    编写访问数据库的Java程序还需要几个重要的类和接口. DriverManager类 DriverManager类处理驱动程序的加载和建立新数据库连接.DriverManager是java.sql包中用于管理数据库驱动程序的类.通常,应用程序只使用类DriverManager的getConnection()静态方法,用来建立与数据库的连接,返回Connection对象: static Connection getConnection(String url,String username,Stri

随机推荐