關於接口
接口描述了實現了它的類擁有什麼功能。因為Java是強類型的,所以有些操作必須用接口去約束和標記。接口作為類的能力的證明,它表明了實現了接口的類能做什麼。
類似與class,interface也是java中的一種引用類型。
接口中的成員
接口中的所有的成員,缺省情況下都是public的,也必須是public,無論是方法,還是字段。因為接口就是規定了API,如果實現的類不公開接口中的API,怎麼能叫API呢?
一般情況下,接口中可以 定義方法 和 字段。
接口中的字段,必須(默認)為 public static final 。在定義的接口中必須初始化,因為是final。它們將成為類中的靜態常量字段
接口中的方法,必須(默認)為 public abstract 。只需在接口中定義即可,不能實現(讓實現了接口的類去實現)。將成為類中的public 實例方法 , 實現了接口的類必須實現接口中定義的方法。
定義一個接口
interface InterfaceName [extends interface1,interface2]
{
void foo();
void bar();
//...紅色部分是 可選的
}
接口和類之間的implements關系
接口就是用來被實現implements 的 ,不然定義接口也就沒意義了。Java中的類只能繼承一個父類,但是可以實現多個接口。除了抽象類,普通類必須實現接口中定義的所有方法。
當一個類實現了某個接口後,接口可以看做是 是實現了接口的類 的 父類型。利用多態的特性,我們往往選擇面向接口編程,而不是面向具體的類,這樣可以讓程序員關注API而不是內部實現,並提供更大的靈活性。
public class Test
{
public static void main(String[] args)
{
Workable[] workers = {
new Teacher(),new Student()
};
fireWork(workers);
}
public static void fireWork(Workable[] workers)
{
for (int i = 0; i < workers.length; i++)
{
workers[i].doTask();
}
}
}
interface Workable
{
void doTask();
}
class Student implements Workable
{
@Override
public void doTask()
{
System.out.println("學生的工作是學習");
}
}
class Teacher implements Workable
{
@Override
public void doTask()
{
System.out.println("老師的工作是教書");
}
}
每一個Teacher 、Student對象都是Workable對象,可以直接隱式轉換。fireWork方法是面向接口編程的思想,傳入的參數為Workable數組,那數組中的所有元素都可以執行
doTask方法(這正是接口約束帶來的效果),而不管他們的具體類型。
抽象類與接口
java集合框架中的例子。抽象類不必實現接口中的方法,但是普通類一定強制實現接口中的所有方法。
接口和接口之間的extends關系
接口可以擴展extends 已經存在的接口,如果接口A擴展了接口B,則A將繼承B中的所有成員,就像他們定義在A中一樣。一個接口可以擴展多個接口。
interface Workable
{
void doTask();
}
interface SchoolMember extends Workable
{
void sayHello();
}
這樣,一個類如果要實現SchoolMember 接口,就必須實現 doTask 和 sayHello 2個方法,因為SchoolMember繼承了doTask方法。
接口的總結
1、接口不能new出實例。但可以定義接口類型的變量,去引用實現了這個接口的類的對象。此時接口相當於實現類的父類。
2、接口中的方法不實現,而是用一個 分號 ; 代替函數體。
3、接口是Java中的一種引用類型。