Java 接口

2018-01-19 15:35 更新

Java面向?qū)ο笤O(shè)計(jì) - Java接口

什么是接口?

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)用它所引用的對象上的方法。


例2

下面的代碼創(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)記接口標(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)性 - 一個(gè)對象,多個(gè)視圖

多態(tài)性是指對象具有多種形式的能力。

多態(tài)性是對象提供其不同視圖的能力。

接口讓我們創(chuàng)建一個(gè)多態(tài)對象。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號