【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());
	}
	
}

结果

在这里插入图片描述

捐赠

若你感觉读到这篇文章对你有启发,能引起你的思考。请不要吝啬你的钱包,你的任何打赏或者捐赠都是对我莫大的鼓励。

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