当前位置 : 主页 > 编程语言 > java >

java 接口

来源:互联网 收集:自由互联 发布时间:2022-07-13
我们经常听到服务提供商这样说 “如果类遵从某个特定接口,那么就履行这项服务” 下面给出一个具体的示例 Arrays 类中的 sort 方法承诺可以对对象数组进行排序,但要求满 足下列前

 

我们经常听到服务提供商这样说 “如果类遵从某个特定接口,那么就履行这项服务”

下面给出一个具体的示例 Arrays 类中的 sort 方法承诺可以对对象数组进行排序,但要求满

足下列前提:对象所属的类必须实现了 mpar 接口 

下面是 omparable 接口的代码仅供非商业用途或交流学习使用

212 Java 核心技术

public interface Compa able

int compa eTo(Object othe 「);

这就是说,任何实现 Comparable 接口的类都需要包含 compareTo 法,并且这个方法的

数必须是 Object 对象,返回 个整型数值

目注释:在 Java SE 5.0 中, Comparable 接口已经改进为泛型类型

public inte face Compa able<T>

int compare To CT other) ; 11 pa amete has type T

例如,在实现 Comparable<Employee>接口的类中,必须提供下列方法

h )
MVAC AC

- nu
( E nur
TE

- a
FL O nur
·n
1

还可以使用不带类型参数的“原始” Comparable 类型 这样一来, compareTo 方法

就有一个 Object 类型的参数,必须手动将 compareTo 方法的这个参数强制转换为所希望

的类型 稍后我们就会做这个工作,所以不用担心同时出现两个新概念

接口中的所有方法自动地属于 public 因此,在接口中声明方法时,不必提供关键

public

当然,接 口中还有 个没有明确说明的附加要求:在调用 compareTo(y)的时候, 这个

compare To 方法必须确实比较两个对象的内容,并返回比较的结果 小于 时,返

个负数;当 时,返回 ;否则返回 个正数

上面这个接口只有一个方法, 而有些接口可能包含多个方法 稍后可以 到,在接口

中还可以定义常 然而,更为重要的是要知道接口不能提供哪些功能 接口绝不能含

有实例域,在 Java SE 之前,也不能在接口中实现方法 (在 6.1.4 节和 6.1.5 节中可以

到,现在已 可以在接口中提供简单方法了 当然,这些方法不能引用实例域一一接口没有

提供实例域和方法实现的任务应该由实现接口的那个类来完成 因此,可以将接口看成

是没有实例域的抽象类 但是这两个概念还是有一定区别的,稍后将给出详细的解释

现在,假设希望使用 Arrays 类的 sort 方法对 Employee 对象数组进行排序, Employee

就必须实现 Comparable 接口

为了让类实现一个接口,通常需要下面两个步骤:

1 )将类声明为实现给定的接口

)对接口中的所有方法进行定义

要将类声明为实现某个接口,需要使用关键字

implements:

java 接口_编译器

当然,这里的 Employee 类需要提供 compareTo 方法 假设希望根据雇员的薪水进行比较

213

以下是 compareTo 方法的实现:


 

 

java 接口_实例域_02

 

 

 

在这里,我们使用了静态 Double.compare 方法,如果第一个参数小于第 个参数,它会返回

个负值;如果二者相等则返回 ;否则返回一个正值

 

警告:在接口声明中,没有将 compareTo 方法声明为 public ,这是因为在接口中的所有

方法都自动地是 public 不过,在实现接口时,必须把方法声明为 public ;否则,编译器

将认为这个方法的访问属性是包可见性,即类的默认访问属性,之后编译器就会给出试

图提供更严格的访问权限的警告信息

我们可以做得更好一些 可以为泛型 Comparable 接口提供一个类型参数

 

 

 

java 接口_java_03

 

 

提示: Comparable 接口中的 compareTo 方法将返回一个整型数值 如果两个对象不相等,

则返回一个正值或者一个负值 在对两个整数域进行比较时,这点非常有用 例如,假

设每个雇员都有一个唯一整数 id ,并希望根据 对雇员进行重新排序,那么就可以返回

id-other.id 如果第一个 ID 小于另一个 ,则返回一个负值;如果两个 ID 相等,则返回

;否则,返回一个正值 但有一点需要注意:整数的范围不能过大,以避免造成减法

运算的溢出 如果能够确信 ID 为非负整数,或者它们的绝对值不会超过 (Integer.MAX

VALUE-1) ,就不会出现问题 否则,调用静态 Integer.compare 方法

当然,这里的相减技巧不适用于浮点值 因为在 salary other.salary 很接近但又不

相等的时候,它们的差经过四舍五入后有可能变成 x<y 时, Double.compare(x, )调

用会返回- ;如果 x>y 则返回

现在,我们已经看到,要让一个类使用排序服务必须让它实现 compareTo 方法 这是理

所当然的,因为要向 sort 方法提供对象的比较方式 但是为什么不能在 Employee 类直接提

compareTo 方法,而必须实现 Comparable 接口呢?

主要原因在于 Java 程序设计语言是一种强类型( strongly typed )语言 在调用方法的时

候,编译器将会检查这个方法是否存在 sort 方法中可能存在下面这样的语句: 

 

 

 

 

java 接口_实例域_04

 

 

 

 



上一篇:Java 8 新特性 - Stream流
下一篇:没有了
网友评论