W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Java中的接口定義了一個(gè)引用類型來創(chuàng)建抽象概念。接口由類實(shí)現(xiàn)以提供概念的實(shí)現(xiàn)。
在Java 8之前,一個(gè)接口只能包含抽象方法。 Java 8允許接口具有實(shí)現(xiàn)的靜態(tài)和默認(rèn)方法。
接口通過抽象概念定義不相關(guān)類之間的關(guān)系。
例如,我們可以創(chuàng)建一個(gè)Person類來表示一個(gè)人,我們可以創(chuàng)建一個(gè)Dog類來表示一只狗。
人和狗都可以走路。這里的步行是一個(gè)抽象的概念。狗可以走,人也是這樣。這里我們可以創(chuàng)建一個(gè)名為Walkable的接口來表示walk的概念。然后我們可以有Person類和Dog類來實(shí)現(xiàn)Walkable概念并提供自己的實(shí)現(xiàn)。 Person類實(shí)現(xiàn)了Walkable接口,并使人以人的方式走路。Dog類可以實(shí)現(xiàn)Walkable界面,使狗以狗的方式走路。
在下面我們將使用一個(gè)例子來說明為什么我們需要接口。
假設(shè) Person
類有一個(gè)walk()方法。
public interface Walkable { void walk(); } class Person implements Walkable { public Person() { } public void walk() { System.out.println("a person is walking."); } } class Dog implements Walkable { public Dog() { } public void walk() { System.out.println("a dog is walking."); } }
類可以在其聲明中使用關(guān)鍵字implements實(shí)現(xiàn)一個(gè)或多個(gè)接口。
通過實(shí)現(xiàn)一個(gè)接口,類保證它將為接口中聲明的所有方法提供一個(gè)實(shí)現(xiàn),或者類將自己聲明為抽象。
如果一個(gè)類實(shí)現(xiàn)了Walkable接口,它必須提供walk()方法的實(shí)現(xiàn)。
像類一樣,接口定義了一個(gè)新的引用類型。
當(dāng)定義一個(gè)新的接口(例如,Walkable)時(shí),我們定義一個(gè)新的參考接口類型。
以下聲明有效:
Walkable w; // w is a reference variable of type Walkable
您不能創(chuàng)建接口類型的對象,因?yàn)榻涌谑嵌x抽象概念。以下代碼無效:
new Walkable(); // A compile-time error
我們可以為一個(gè)類類型創(chuàng)建一個(gè)對象,但是我們可以使用一個(gè)接口類型變量來引用其類實(shí)現(xiàn)該接口的任何對象。
因?yàn)镻erson和Dog類實(shí)現(xiàn)了Walkable接口,所以Walkable類型的引用變量可以引用這些類的對象。
Walkable w1 = new Person(); // OK Walkable w2 = new Dog(); // OK
我們可以使用它的引用類型變量訪問接口的任何成員。由于Walkable接口只有一個(gè)成員,這是walk()方法,我們可以編寫如下代碼:
// Let the person walk w1.walk(); // Let the dog walk w2.walk();
當(dāng)調(diào)用w1上的walk()方法時(shí),它調(diào)用Person對象的walk()方法,因?yàn)閣1指的是Person對象。
當(dāng)調(diào)用w2上的walk()方法時(shí),它調(diào)用Dog對象的walk()方法,因?yàn)閣2指的是Dog對象。
當(dāng)使用接口類型的引用變量調(diào)用方法時(shí),它調(diào)用它所引用的對象上的方法。
下面的代碼創(chuàng)建了一個(gè)方法來使用interface我們的參數(shù)類型。
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 }
接口聲明以修飾符列表開頭,可能為空。
像類一樣,一個(gè)接口可以有一個(gè)公共或包級別的作用域。
關(guān)鍵字public用于指示接口具有公共范圍。
缺少范圍修飾符指示接口具有包級別作用域。具有包級別作用域的接口只能在其包的成員內(nèi)引用。
關(guān)鍵字interface用于聲明接口,后面是接口的名稱。
接口的名稱必須是有效的Java標(biāo)識符。
接口體跟在其名稱后面并放在大括號內(nèi)。
接口的主體可以為空。以下是最簡單的接口聲明:
package com.w3cschool; interface Updatable { // The interface body is empty }
像類一樣,一個(gè)接口有一個(gè)簡單的名稱和一個(gè)完全限定名。關(guān)鍵字interface后面的標(biāo)識符是其簡單名稱。
接口的完全限定名稱通過使用其包名稱和用點(diǎn)分隔的簡單名稱形成。
在上面的示例中,Updatable是簡單的名稱,com.java2s.Updatable是完全限定名稱。
使用接口的簡單和完全限定名的規(guī)則與類的規(guī)則相同。
下面的代碼聲明一個(gè)名為ReadOnly的接口。它有一個(gè)公共范圍。
package com.w3cschool; public interface ReadOnly { // The interface body is empty }
接口聲明總是抽象的,無論是否明確聲明它是抽象的。
標(biāo)記接口是沒有成員的接口。
標(biāo)記接口標(biāo)記具有特殊含義的類。
interface Shape { } class Circle implements Shape{ } Shape c = new Circle(); if (c instanceof Shape) { System.out.println("Using a Shape object"); }
Java API有許多標(biāo)記接口。 java.lang.Cloneable,java.io.Serializable和java.rmi.Remote都是標(biāo)記接口。
僅具有一個(gè)抽象方法的接口被稱為功能接口。
多態(tài)性是指對象具有多種形式的能力。
多態(tài)性是對象提供其不同視圖的能力。
接口讓我們創(chuàng)建一個(gè)多態(tài)對象。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: