接口概念
在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());
}
}
結果
捐贈
若你感覺讀到這篇文章對你有啓發,能引起你的思考。請不要吝嗇你的錢包,你的任何打賞或者捐贈都是對我莫大的鼓勵。