1. 程式人生 > >Java——標識介面的作用

Java——標識介面的作用

大家都知道,Java不支援多重繼承,一個類只能有一個子類。而為了克服單繼承的缺點,Java引入了介面的概念。

介面是抽象方法定義的集合,它是一種特殊的抽象類。介面中只包含了方法的定義,並沒有方法的實現。介面中所有方法都是抽象的。介面中成員的作用域修飾符都是public,而介面中的常量值預設用public static final來修飾。

由於一個類可以有多個介面,因此通常可以採用實現多個介面的方式來間接達到多重繼承的效果。

看介面程式碼多的人或許會發現,有些介面內部沒有宣告任何方法,也就是說,實現這些介面的類不需要重寫任何方法,這些沒有任何方法宣告的介面又被叫做“標識介面”

。也就是咱們今天的主角。

接下來,就讓我們瞅瞅這標識介面到底有什麼能耐。

你对å¡ä¸»è¡¨æåæä¹ç?å¼ ç¿°:åµåµ(ç»å¾)å¾ç

上文已經提到,標識介面嘛,它裡邊啥方法都沒有寫,什麼都沒有,那它有什麼用呢?

正如它的名字所言,標識介面嘛,當然是用來當做標識的啦。正因如此,標識介面對於實現它的類沒有任何語義上的要求。

該類介面在使用的時候通常會用instanceof來判斷示例物件的型別是否實現了一個給定了的標識介面。

舉個例子——

還記得那日風雲大作,電閃雷鳴,紫氣東來,大有吞山之勢。本帥博主夜觀星象,自覺近日的不凡,似乎將有祕寶出世,遂在出門遛腿之際追尋紫氣的蹤跡。果不其然,在一個不起眼的臭水溝裡,我尋到一槓獵槍。只見該獵槍上貼著一個標籤,上書“智慧獵槍”幾大字,在昏暗的夜色中閃著耀眼的光芒。該獵槍還附贈一本說明書,將該槍的智慧說了個明白:該槍會自動分辨人類和獵物(如兔子,羊等),並開槍射擊獵物。

拾到此物,我心大喜,立馬到林子裡試了試,果然,一掃描到獵物它就開槍,一發現是人就不開槍。

咳咳......好的,意淫結束,繼續迴歸正題。

上文字帥博主的意淫就是一個很好的例子,人類相當於是一個標識介面,動物也是一個標識介面。獵槍將藉助標識介面來分辨人類和動物,也就是說,當獵槍掃描到繼承於人類的所有類都不會開槍,而掃描到繼承於獵物的類就會自動開槍。

咳咳,如果大家忍受不了上文的意淫,那麼下面就用程式碼給大家展示一下標識介面的作用。

一個用來表示萬事萬物的SomeThing 

public interface SomeThing {} 
人類的介面: 
public interface Humans extends SomeThing {} 

動物的介面: 
public interface Animals extends SomeThing {} 

然後是一系列的實現: 
中國人: 
public class Chinese implements Humans {} 

日本人: 
public class Japanese {} 

狗: 
public class Dog implements Animals {} 

妖怪(他很聰明,給自己帖上了人的標籤): 
public class Monster implements Humans {} 

下面這個程式的核心部分,獵人類及客戶端程式: 
public class Hunter { 
public void fire(Object target) 
{ 
if(target instanceof Humans) 
{ 
System.out.println("這下完了,打中了一個人,該去坐牢了!"); 
} 
else 
{ 
System.out.println("恭喜你,打中了一隻動物!"); 
} 
} 
//智慧的槍 
public void intelligentFire(Object target) 
{ 
if(target instanceof Humans) 
{ 
return; 
} 
System.out.println("開了一槍!"+target.getClass()); 
//下面進行秒殺等相關處理 
//銷燬他 
target=null; 
} 
public static void main(String[] args) { 
Hunter hunter=new Hunter(); 
Object[] objects=new Object[]{new Dog(),new Japanese(),new Japanese(),new Chinese(),new Monster(),new SomeThing(){}}; 
for(int i=0;i<objects.length;i++) 
hunter.intelligentFire(objects[i]); 
} 
} 


執行程式,你會發現輸出類似下面結果: 

開了一槍!class springroad.demo.taginterface.Dog 
開了一槍!class springroad.demo.taginterface.Japanese 
開了一槍!class springroad.demo.taginterface.Japanese 
開了一槍!class springroad.demo.taginterface.Hunter$1 

由此可見,智慧獵*瞄準6個目標,開了4槍。只對Chinese、及Monster的例項沒有開槍。因為這裡討論的是標籤介面,雖然Humans沒有任何方法,但從智慧獵*的角度來看,他就是通過這個標籤來判斷是否可以開火的。他不用管也管不了目標的層次等級關係(比如Japanese肯定很非常鮮明等級結構),即繼承關係。他也管不了目標的來自於哪兒。比如,是用new操作符建立,還是從容器中取,或者是從網路某個地方載入一個。 
Hunter只是制訂了一個簡單的規則,你要想不讓我的獵槍對你開火,你就必須在自己身上帖上一個Humans的標籤。也就是說你必須遵守這個規則。 
現在回過頭來看,因為妖怪Monster真身應該是一條蛇或其它什麼動物,但是他懂得Hunter制訂的規則,巧妙的給自己帖上了一個Humans的標籤,以致於欺騙了我們的智慧獵槍,躲過一劫。 
而Japanese則自認為自己了不起,不按規則辦事,我就不理你Hunter制訂的規則,什麼Humans標籤,我就是不用。於是放到我們的程式中當然就只有挨殺的份了。 

因此,在某些重要的時刻,標識介面的重要性可見一斑,畢竟,那可是性命攸關的大事呀~

 

 

好啦,以上就是關於標識介面的作用的總結,大家要是有什麼疑問或者更好的見解,歡迎大家留言評論,我們一起討論討論呀~

參考文章:https://www.aliyun.com/jiaocheng/579062.html

 

Biu~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!