细说Java的接口(一)

简介:
君子不器。(君子不能像器具一般,只有一种用途。)


——《论语》


    这一章讨论
Java 编程中的另外一个重要概念和技术——接口。首先阐述什么是接口,它与类和抽象类的不同,以及使用接口的目的。本章通过实例详细讨论怎样编写接口和实现接口,怎样利用接口实现多重继承,接口本身的继承性,以及接口的具体应用实例。

9.1  概述

类似于硬件接口设计,如计算机母板上的各种接口, Java 语言中的接口,应用高度抽象概念和编程形式,以及应用时必须完善接口的要求,达到对象通过接口与外部世界的      联系。

9.1.1  接口和类

如果说类对它所代表的对象的形态和行为提供了具体的运算和操作代码,接口只是对要实现接口的所有类提出了协议( protocol )。这些协议是类和接口的通讯和对话管道,以静态常量和方法签名的形式,使不同的类之间建立起一个共享体制,这就像 CPU 的管脚对准其接口的插脚一样。这看起来似乎对类很宽容,实际上对类提出了管理和组织机制。对类的行为,提出了政策性的宏观控制。

 

public interface Plugable {
    static final String componentID = "CPU";        // 可选项
    void plugin(argumentList);                      // 可选项
}

 

即接口中只规定静态常量,方法签名以及返回类型,而无具体操作代码。具体的方法行为由继承这个接口的类来实现。可以看到,一个接口有可能是只有接口名的空接口。
接口具有可继承性。如同类一样,接口中的静态常量(如果有,只能是公共静态常量)和方法可以被实现它的类所继承。所以,接口技术为在 Java 中实现多重继承( multiple inheritance )提供了可能性。即一个子类可以继承多个直接超类。在 Java 编程中,更确切地说,应该是一个子类可以继承一个直接超类和多个接口(参见图 7.4 )。即:

 

public class SubClass extends SuperClass implements Interface1, Interface2, InterfaceN {
    ...
}

 

我们称这种多重继承为间接多重继承。因为子类仅继承了接口中对方法编写的协议规范,还必须编写完善这些方法的具体代码。
如果说子类继承超类是“ is a ”,即“是”的关系,类和支持类之间是“ has a ”,即“有”的关系,或称“组合”,那么类和接口则是“ like a ”,即“像是”的关系。接口表示,所有实现了我这个接口的类都具有我规定的协议,即“看起来都像我”,确切地说,“看起来都像我的签名”。因为完善这个接口的类必须按照签名和返回类型编写具体代码。当然,类知道应该调用哪些方法才可实现继承过来的接口功能。作一个比喻,继承好比“给予财富”,组合好比“你拥有我”,而接口则是“你中有我”。
接口技术有助于实现类之间的“松散关联”关系( loose coupling ,也称松散耦合)。“松散关联”阐述了如下两个面向对象编程中的重要原则:
1.          尽可能地使类独立存在,“自给自足”( tied cohesion )。
2.          如果类之间有依赖关系,尽可能实现松散关联( loose coupling )。
接口以协议的形式建立了类之间的松散关系。体现了行为规范和行为实现的分离。使接口,这个特殊类的设计,上升到更抽象的高度。

9.1.2  接口和抽象

        接口的本质是抽象,是抽象类完全抽象化的体现。所以有些文献中称接口为“纯抽象类”。如果说在抽象类中,还允许完善了的方法和实例变量存在的话,在接口中,只允许有代表协议的方法签名和其返回类型,以及静态常量。
抽象类中,以抽象方法作为接口,成为子类实现多态的协议规范。而接口将类的全部内容升华为抽象,成为子类按照指定行为规范,遵循协议约定来实现接口功能的准则。实际上,接口对抽象类提供了行为规范和行为实现分离的绝好机会,使得改写后的抽象类更加符合“自给自足”和“松散耦合”的设计原则。如一个抽象类:

 

public abstract someAbstractClass {
    ...
    public abstract void someMethod();
}

 

分离成为一个接口和一个完善接口的类:

 

public interface SomeInterface {
    public abstract void someMethod();
}

 

以及:

 

public class SomeClass implements someInterface {
    ...
    public void someMethod() {...}
}

 

这样做的好处是:
l   使协议成为独立的接口。
l   使成为接口的协议具有更广泛的代表性和应用空间。
l   使抽象类从抽象中分离出来,使其不再包括抽象方法,因而具有创建对象的功能(注意抽象类不能够创建对象)。

9.1.3  步入接口

接口的语法格式为:

 

public interface InterfaceName {
    public static final varType CONSTANT_NAME = value;      // 可选项
    public abstract returnType methodName(argumentList);    // 可选项
}

 

其中:
interface ——关键字。用来定义一个接口。
varType ——任何基本变量类型。接口中的变量必须是静态常量。 public static final 关键字可以省略。一个接口可以没有静态常量。
returnType ——返回类型。可以是任何变量类型或者对象,或 void
argumentList ——包括参数类型和参数名。多个参数间用逗号分隔。接口中所有的方法必须是抽象方法。 public abstract 关键字可以省略。一个接口可以没有方法声明。
所以接口的简化语法格式为:

 

public interface Interface Name {
varType CONSTANT_NAME value;                // 可选项
return Type method Name (argument List);    // 可选项
}

 

以下利用这个简化格式讨论接口技术和编程。
1 :编写一个 Printable 接口。

 

public interface Printable {
    void print();
}

 

这个接口规定凡是实现这个接口的类必须有 print() 方法,它的返回类型是 void 的。
2 :编写一个只有静态常量的接口。

 

public interface DepartmentCode {
    int ADMINI = 1;
    int FINANCE = 2;
    int MARKETING = 3
    int SERVICES = 4;
}

 

这个接口只定义了静态常量。完善它的所有类必须遵循这些部门代码的规定。
3 :编写一个对所有图形组件规定位置协议的接口。

 

public interface Positionable {
    short X0 = 0;
    short Y0 = 0;
    short getX();
    short getY();
    void setX(short x);
    void setY(short y);
}

 

这个接口规定了所有图形组件的原始坐标,以及必须具有的方法协议。
4 API Cloneable 接口。

 

public interface Cloneable {
}

 

这是 Java API 的空接口。它建议完善它的类应该覆盖 Object.Clone() 方法。我们将在以后的小节讨论如何完善这个接口。




















本文转自高永强51CTO博客,原文链接: http://blog.51cto.com/yqgao/178010  ,如需转载请自行联系原作者

相关文章
|
28天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
111 3
|
2月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
45 6
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
34 2
|
15天前
|
Java API
Java中内置的函数式接口
Java中内置的函数式接口
19 2
|
19天前
|
Java
在Java中如何实现接口?
实现接口是 Java 编程中的一个重要环节,它有助于提高代码的规范性、可扩展性和复用性。通过正确地实现接口,可以使代码更加灵活、易于维护和扩展。
43 3
|
18天前
|
Java
在Java中,接口之间可以继承吗?
接口继承是一种重要的机制,它允许一个接口从另一个或多个接口继承方法和常量。
55 1
|
18天前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
36 1
|
18天前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
32 1
|
24天前
|
Java Android开发
Eclipse 创建 Java 接口
Eclipse 创建 Java 接口
25 1
|
28天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
39 1