接口概念
在Java程序设计语言中,接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。
我们经常听到服务提供商这样说:“如果类遵从某个特定接口,那么就履行这项服务”。如,Arrays类中的sort方法承诺可以对对象数组进行排序,但要求满足下列前提:对象所属的类必须实现了Comparable接口。接口代码如下:
public interface Comparable<T> {
public int compareTo(T o);
}
在Java SE 5.0中,Comparable的接口改为了泛型类型,之前是用Object作为参数。
这个接口的意思就是,任何实现Compareble接口的类都需要包含compareTo方法,并且使用正确的泛型参数,返回一个整型数值。
接口中的所有方法自动地属于public。因此,在接口中声明方法时,不必提供关键字public。
当然,接口中还有一个没有明确说明的附加要求:在调用x.compareTo(y)的时候,这个compareTo方法必须确实比较两个对象的内容,并返回比较的结果。当x小于y时,返回一个负数;当x等于y时,返回0;否则返回一个正数。
这个接口只有一个方法,当然,接口可以包含多个方法。在接口中还可以定义常量。但,接口绝不能包含实例域,在Java SE 8之前,也不能在接口中实现方法。
提供实例域和方法实现的任务应该由实现接口的那个类来完成。因此,可以将接口看成是没有实例域的抽象类。但这两个感念还是有一定区别的。
现在,假设希望使用Arrays类的sort方法对Employee对象数组进行排序,Employee类就必须实现Comparable接口。
为了让类实现一个接口,通常需要下面两个步骤:
- 让类声明为实现给定的接口。
- 对接口中的所有方法进行定义。
要将类声明为实现某个接口,需要使用关键字implements:
class Employee implements Comparable<Employee>
当然,这里的Employee类需要提供compareTo方法。假设希望根据雇员的薪水进行比较。
public int compareTo(Employee other) {
return double.compare(salary, other.salary);
}
这里,使用了静态的Double.compare方法,如果第一个参数小于第二个参数,它会返回一个负值;如果二者相等则返回0;否则返回一个正值。
现在,我们已经看到,要让一个类使用排序服务必须让它实现compareTo方法。这是理所当然的,因为要向sort方法提供对象的比较方式。但是为什么不能在Employee类直接提供一个compareTo方法,而必须实现Comparable接口呢?
主要原因在于Java程序设计语言是一种强类型(strongly typed)语言。在调用方法的时候,编译器将会检查这个方法是否存在。在sort方法中可能存在下面这样的语句:
if (a[i].compareTo(a[j]) > 0) {
...
}
为此,编译器必须确认a[i]一定有compareTo方法。如果a是一个Compareble对象的数组,就可以确保拥有compareTo方法,因为每个实现Comparable接口的类都必须提供这个方法的定义。
实例
Employee.java
package cn.freedompc.interfaces;
public class Employee implements Comparable<Employee> {
private String name;
private double salary;
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public void raiseSalary(double byPercent) {
double raise = salary * byPercent / 100;
salary += raise;
}
public int compareTo(Employee other) {
return Double.compare(salary, other.salary);
}
}
EmployeeSortTest.java
package cn.freedompc.interfaces;
import java.util.Arrays;
public class EmployeeSortTest {
public static void main(String[] args) {
Employee[] staff = new Employee[3];
staff[0] = new Employee("Harry Hacker", 35000);
staff[1] = new Employee("Carl Cracker", 75000);
staff[2] = new Employee("Tony Tester", 38000);
Arrays.sort(staff);
for (Employee e : staff)
System.out.println("name = " + e.getName() + ", salary = " + e.getSalary());
}
}
结果
捐赠
若你感觉读到这篇文章对你有启发,能引起你的思考。请不要吝啬你的钱包,你的任何打赏或者捐赠都是对我莫大的鼓励。