【java基礎(三十六)】接口(一)

接口概念

在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接口。

爲了讓類實現一個接口,通常需要下面兩個步驟:

  1. 讓類聲明爲實現給定的接口。
  2. 對接口中的所有方法進行定義。

要將類聲明爲實現某個接口,需要使用關鍵字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());
	}
	
}

結果

在這裏插入圖片描述

捐贈

若你感覺讀到這篇文章對你有啓發,能引起你的思考。請不要吝嗇你的錢包,你的任何打賞或者捐贈都是對我莫大的鼓勵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章