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~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~pia!