后面的博文,我们将开始Java的常用高级技术学习。
接口技术,主要用来描述类具有什么样的功能,而并不给出每个功能的具体实现。一个类可以实现(implement)一个或多个接口,并在需要接口的地方,随时使用实现了相应接口的对象。
本文,我们将从以下几个主要方面对接口进行深入学习
- 接口
- 对象克隆
- 接口与回调
此外还有经常用到的Comparable和Comparator接口。
1、接口
接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。
下面我们来看下Comparable接口的代码
public interface Comparable
{
int compareTo(Object other);
}
即任何实现 Comparable接口的类都需要包含CompareTo方法,而这个方法的参数必须是一个Object对象。
(1)实际上,现在的Comparable接口已经改进成了泛型类型
public interface Comparable<T>
{
int compareTo(T other);
}
(2)接口中的所有方法都自动属于public,因此,在接口中声明方法时,不必再提供关键字public。
(3)在调用x.compareTo(y)
的时候,当x小于y时,返回一个负数,相等时返回0,否则返回一个正数
(4)接口中可以包含多个方法,可以定义常量,但绝不能含有实例域,也不能在接口中实现方法。提供实例域和方法实现的任务应该由实现接口的那个类来完成。此外,接口中的域都被自动设为public static final。
那么,如果希望使用Arrays类的sort方法对Employee对象数组进行排序,Employee类就必须实现Comparable接口。
为了让类实现一个接口,通常需要:
- 将类声明为实现给定的接口(使用关键字implements)
- 对接口中的所有方法进行定义
(1)将类声明为实现给定的接口,需要使用关键字implements:
class Employee implements Comparable
(2)然后为Employee类提供compareTo方法,假设希望根据Employee的salary进行比较
public int compareTo(Object otherObject)
{
Employee other = (Employee) otherObject;
return Double.compare(salary, other.salary);
}
注意,在接口声明中不必将compareTo方法声明为public(前1);但是在实现接口时,必须将方法声明为public(后2)。
为了避免总是出现Object的类型转换,可以将上面的实现替换为对Comparable<Employee>
接口的实现
class Employee implements Comparable<Employee>
{
public int compareTo(Employee other)
{
return Double.compare(salary, other.salary);
}
···
}
1.1 接口的特性
接口不是类,尤其不能使用new运算符实例化一个借口
x = new Comparable(···); \\Error
然而,尽管不能构造接口的对象,却能声明接口的变量
Comparable x; \\OK
而且接口变量必须引用实现了接口的类对象
x = new Employee(···); \\OK
1.2 接口与抽象类
使用抽象类表示通用属性存在一个问题:每个类只能扩展于一个类。但每个类可以实现多个接口。