Java接口教學
Java接口教程
接口是什麼?
Java中的接口定義了一個引用類型來創建抽象概念。 接口由類實現,它是用來提供概念的實現。
在Java 8之前,一個接口只能包含抽象方法。 Java 8允許接口具有實現的靜態和默認方法。
接口通過抽象概念定義不相關類之間的關係。例如,可以創建一個Person
類來表示一個人,也可以創建一個Dog
類來表示一隻狗。
人和狗都可以走路。 這裏的走路是一個抽象的概念。 狗可以走路,人也是走路。這裏可以創建一個名爲Walkable
的接口來表示走路這個概念。然後在Person
類和Dog
類中各自實現Walkable
概念(如:實現怎麼走路)。 Person
類實現了Walkable
接口以人的方式走路(如:用兩條腿走路)。 Dog
類可以實現Walkable
接口以狗的方式走路(如:用四條腿走路)。
示例-1
下面將使用一個例子來說明爲什麼需要接口。
假設Person
類有一個walk()
方法。
在相同的包下創建一個接口文件 - Walkable.java 並使用以下代碼 -
public interface Walkable {
void walk(); // 接口中只有一個方法
}
在相同的包下創建一個主類 -Main.java 並使用以下代碼 -
class Person implements Walkable {
public Person() {
}
public void walk() {
System.out.println("人走路:使用兩條腿足路.");
}
}
class Dog implements Walkable {
public Dog() {
}
public void walk() {
System.out.println("狗走路:使用四條腿足路.");
}
}
public class Main {
public static void main(String[] args) {
Walkable[] w = new Walkable[2];
w[0] = new Person();
w[1] = new Dog();
w[0].walk();
w[1].walk();
// 或者
// Person p = new Person();
// p.walk();
}
}
上面的代碼輸出結果如下 -
人走路:使用兩條腿足路.
狗走路:使用四條腿足路.
類可以在其聲明中使用關鍵字implements
實現一個或多個接口。通過實現一個接口,類保證它將爲接口中聲明的所有方法提供一個實現,或者類將自己聲明爲抽象。
如果一個類實現了Walkable
接口,它必須提供walk()
方法的具體實現。
像類一樣,接口定義了一個新的引用類型。當定義一個新的接口(例如,Walkable
)時,定義一個新的參考接口類型。
以下聲明有效:
Walkable w; // w is a reference variable of type Walkable
但是不能創建接口類型的對象,因爲接口是定義抽象概念。 以下代碼無效,編譯會出錯:
new Walkable(); // A compile-time error
只能爲類類型創建對象,但是可以使用一個接口類型變量來引用那些類實現該接口的任何對象。
如:Person
和Dog
類都實現了Walkable
接口,所以Walkable
類型的引用變量可以引用這兩個類的對象。如下代碼是沒有問題的:
Walkable w1 = new Person(); // OK
Walkable w2 = new Dog(); // OK
可以使用它的引用類型變量訪問接口的任何成員。 由於Walkable
接口只有一個成員,也就是walk()
方法,所以這裏可以編寫如下代碼:
// Let the person walk
w1.walk();
// Let the dog walk
w2.walk();
當調用w1
的walk()
方法時,它調用Person
對象的walk()
方法,因爲w1
指的是Person
對象。當調用w2
的walk()
方法時,它調用Dog
對象的walk()
方法,因爲w2
指的是Dog
對象。
當使用接口類型的引用變量調用方法時,它將調用它所引用的對象的方法。
實例-2
下面的代碼創建了一個方法來使用接口參數類型。
public class Main{
public static void main(String[] args) {
Walkable[] w = new Walkable[2];
w[0] = new Person();
w[1] = new Dog();
Walkables.letThemWalk(w);
}
}
class Walkables {
public static void letThemWalk(Walkable[] list) {
for (Walkable w : list) {
w.walk();
}
}
}
聲明接口
聲明接口的一般語法是 -
<modifiers> interface <interface-name> {
Constant-Declaration
Method-Declaration
Nested-Type-Declaration
}
接口聲明以修飾符列表開頭,也可以爲空(不寫)。像類一樣,一個接口可以有一個公共或包級別的範圍。
關鍵字public
用於指示接口具有公共範圍。缺少範圍(不使用)修飾符表示接口具有包級別作用域。 具有包級別作用域的接口只能在其包的成員內引用。
關鍵字interface
用於聲明接口,後面是接口的名稱。
接口的名稱必須是有效的Java標識符。接口主體跟在其名稱後面並放在大括號內。接口的主體可以爲空。 以下是最簡單的接口聲明:
package com.yiibai;
interface Updatable {
// The interface body is empty
}
像類一樣,一個接口有一個簡單的名稱和一個完全限定名。關鍵字interface
後面的標識符是其簡單名稱。接口的完全限定名稱通過使用其包名稱和用點分隔的簡單名稱組成。
在上面的示例中,Updatable
是簡單的名稱,com.yiibai.Updatable
是完全限定名稱。使用接口的簡單和完全限定名的規則與類的規則相同。
下面的代碼聲明一個名爲ReadOnly
的接口。 它有一個公共(public
)範圍。
package com.yiibai;
public interface ReadOnly {
// The interface body is empty
}
接口聲明總是抽象的,無論是否明確聲明它爲抽象。
標記接口
標記接口是沒有成員的接口。標記接口用來標記類具有特殊含義。
interface Shape {
}
class Circle implements Shape{
}
Shape c = new Circle();
if (c instanceof Shape) {
System.out.println("Using a Shape object");
}
Java API有許多標記接口。如:java.lang.Cloneable
,java.io.Serializable
和java.rmi.Remote
都是標記接口。
功能接口
僅具有一個抽象方法的接口被稱爲功能接口。
多態性 - 一個對象,許多視圖
多態性是指對象具有多種形式的能力。多態性是對象提供其不同視圖的能力。使用接口使得我們可以創建一個多態對象。