接口
目前正在按照《Java核心思想:卷一》来复习一些java基础方面的知识。以下内容大部分来自看书的总结。
接口用来描述类应该做什么,而不指定它们具体应该怎么做。在java程序设计语言中,接口不是类,而是对希望复合这个接口的类的一组需求。
例如:Arrays类中的sort方法可以对对象数组进行排序。但是要满足这个条件:对象所属的类必须实现comparable接口。具体需要实现它里面的comparaTo方法。
public interface Comparable {
int comparaTo(Object other);
}
- 接口中的所有方法自动都是public。在接口中声明方法时,不必提供关键字public.
为什么不在一个实现类中直接提供comparaTo方法,而是必须实现一个Comparable接口呢?
主要原因在于java程序设计语言是一个强类型语言,在调用时,编译器会检查这个方法确实存在。在sort方法里可能会有这样的语句:
if (a[i].comparaTo(a[j]) > 0)
{
//rearrange a[i] and a[j]
...
}
编译器会确认a[i]一定有一个comparaTo方法。如果a是一个comparable对象的数组,就可以确保拥有comparaTo方法,在实现接口时就必须提供该方法的定义。
-
接口不是类,不能用new运算符实例化一个接口:
x = new Comparable(...); //error Comparable为一个接口
-
可以声明接口的变量:
Comparable x;
使用instanceOf可以检查一个对象是否实现了某个特定的接口
-
可以拓展接口:
public interface Powered extends Moveable { double milesPerGallon(); }
-
接口中的字段默认是 public static final。
-
每个类只能有一个超类,但是可以实现多个接口。
class Employee implements Cloneable,Comparable
接口与抽象类:
为什么要引入接口的概念?不直接吧上面的Comparable声明为一个抽象类?
使用抽象类表示通用属性存在一个严重的问题。每个类只能拓展一个类。每个类可以实现多个接口。
接口可以提供多重继承的大多好处。同时还可以避免多重继承的复杂性和低效性。