摘要:類似于中的事件驅(qū)動函數(shù),當(dāng)有事件發(fā)生時候,通過回調(diào)函數(shù),通知主函數(shù)。一旦或內(nèi)的某個函數(shù)觸發(fā)了某個事件,就能通過監(jiān)聽接口發(fā)送給主函數(shù),類似中的事件回調(diào)函數(shù)。父類與子類通過實現(xiàn)接口調(diào)用,此時即為父類本身。
http://homeway.me/
查了一些國內(nèi)資料,都說java中extended與implements的區(qū)別是,一個類只能有一個繼承,一個類可以有多個容器。
后來去看了些國外資料。
在我理解上,interface就是一個公共的類,可以包含公共函數(shù)、變量。
Java接口是用于指定一組抽象方法的類來實現(xiàn)一個抽象類型。
當(dāng)一個類實現(xiàn)一個接口,它必須繼承所有的內(nèi)聲明的抽象方法,好像簽訂了一份合同,并履行協(xié)議。
先來看看怎么聲明一個接口,文件保存為 InterFace.java:
public class InterFace { public static void main(String[] args) { MyTest x = new MyTest(); x.speak(); x.say(); x.fuck(); } } class MyTest implements MyInterface2, MyInterface3 { @Override public void speak() { System.out.println("MyTest Called => jump() =>"+MyInterface.hello); } @Override public void fuck() { System.out.println("MyTest Called => fuck()"); } @Override public void say() { System.out.println("MyTest Called => say()"); } } interface MyInterface1{ public String hello = "hello"; public void speak(); } interface MyInterface2{ public int num = 1; public void fuck(); } // 接口之間可以相互繼承 interface MyInterface3 extends MyInterface1{ public void say(); }
輸出如下:
$javac InterFace.java $java InterFace MyTest Called => jump() =>hello MyTest Called => say() MyTest Called => fuck()
這里我們聲明了3個接口,并且interface3繼承自interface1,所以當(dāng)類容器導(dǎo)入接口interface3就會導(dǎo)入父類接口interface1。
只要添加了容器implements,就會包含接口中的所有東西,所以必須在MyTest類中添加該重寫函數(shù),否則找不到該函數(shù)會報錯。
再看下面一個例子,多個類共同使用一個interface接口,保存為Account.java:
interface Transaction { int BALANCE = 500; Object transaction(Object input); } class CurrentAccount implements Transaction { int bal; public Object transaction(Object input) { this.bal = BALANCE - (int)input; return bal; } public String toString() { return "Current acc"; } } class SavingsAccount implements Transaction { int bal; public Object transaction(Object input) { this.bal = BALANCE + (int)input; return bal; } public String toString() { return "Savings acc"; } } public class Account { public static void payment(Transaction t, Object input) { System.out.println(t + " is debited: " + t.transaction(input)); } public static void deposit(Transaction t, Object input) { System.out.println(t + " is credited: " + t.transaction(input)); } public static void main(String[] args) { Integer input = new Integer(600); deposit(new SavingsAccount(), input); payment(new CurrentAccount(), input); } }
代碼輸出:
$javac Account.java $java Account Savings acc is credited: 1100 Current acc is debited: -100
一個接口可以供多個類共同使用,并且多個類之間使用不沖突,這樣看來,interface倒有點像是靜態(tài)函數(shù)了。
觀察一下這兩個實現(xiàn)類活期賬戶和儲蓄賬戶自動的向上轉(zhuǎn)型在接受Transaction接口Account類中的方法。
payment()和deposit()方法利用我們所講的戰(zhàn)略設(shè)計模式,代表了接口的實現(xiàn)完全脫鉤的一個實例。
從理論上說,你可以適應(yīng)任何類,只需使它們符合的界面,使用這些方法。
對于接口與容器,我見過的一個更具有實用價值的地方,在于類之間的監(jiān)聽函數(shù)調(diào)用。
類似于js中的事件驅(qū)動函數(shù),當(dāng)有事件發(fā)生時候,通過回調(diào)函數(shù),通知主函數(shù)。
實例代碼如下,文件命名為Homeway.java:
public class Homeway { public static void main(String[] args) { System.out.println(" =======================Implements====================== "); ClassImplements mClassImplements = new ClassImplements(); mClassImplements.run(); } } class ClassImplements implements Implements1.Listener { public Implements1 mImplements1 = null; public ClassImplements(){ mImplements1 = new Implements1(); mImplements1.setListener(this); } @Override public void onCallStart(){ System.out.println("ClassImplements => onCallStart()"); } @Override public void onCallStop(){ System.out.println("ClassImplements => onCallStop()"); } public void run(){ mImplements1.run(); } } //test 2level implements for class class Implements1 implements Implements2.Listener { private Listener mListener; private Implements2 mImplements2; public Implements1(){ mImplements2 = new Implements2();//把當(dāng)前類傳給下個類 mImplements2.setListener(this); System.out.println("Init Implements1 =>..."); } public static interface Listener { void onCallStart(); void onCallStop(); } public void setListener(Listener listener) { mListener = listener; } @Override public void onCallStart(){ System.out.println("Implements1 => onCallStart()"); mListener.onCallStart();//call at Implements1 and then throw to ClassImplements } @Override public void onCallStop(){ System.out.println("Implements1 => onCallStop()"); mListener.onCallStop();//call at Implements1 and then throw to ClassImplements } public void run(){ this.mImplements2.run(); } } //3 level implement test class Implements2{ private Listener mListener; public Implements2(){ System.out.println("Init Implements2 =>..."); } public static interface Listener { void onCallStart(); void onCallStop(); } public void setListener(Listener listener) { mListener = listener; } public void onCallStart(){ System.out.println("Implements2 => onCallStart()"); } public void onCallStop(){ System.out.println("Implements2 => onCallStop()"); } public void run() { System.out.println("Run some functions and then callback from Listener..."); mListener.onCallStart(); mListener.onCallStop(); } }
輸出如下:
$javac Homeway.java $java Homeway =======================Implements====================== Init Implements2 =>... Init Implements1 =>... Run some functions and then callback from Listener... Implements1 => onCallStart() ClassImplements => onCallStart() Implements1 => onCallStop() ClassImplements => onCallStop()
我們先是聲明了類ClassImplements,這個是我們的主類,并且implements了Implements1.Listener通過一個Listener建立了監(jiān)聽接口,
然后Implements1又implements了Implements2.Listener建立了第2級的監(jiān)聽。
一旦Implements1或Implements2內(nèi)的某個函數(shù)觸發(fā)了某個事件,就能通過監(jiān)聽接口發(fā)送給主函數(shù)ClassImplements,類似js中的事件回調(diào)函數(shù)。
父類與子類通過Listener實現(xiàn)接口調(diào)用,此時Listener即為父類本身。
大致的模型如下:
implements容器與interface接口在java類中有很多很好用的模型,有時間該多去研究研究。
《Java Interfaces》
《Java interfaces and the concept of multiple inheritance》
《Java Interface Example, Explanation, and Implementation》
本文出自 夏日小草,轉(zhuǎn)載請注明出處: http://homeway.me/2015/04/13/java-implements-and-interface/ by 小草 2015-04-13 20:10:20文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64316.html
摘要:引用泛型除了方法因不能使用外部實例參數(shù)外,其他繼承實現(xiàn)成員變量,成員方法,方法返回值等都可使用。因此,生成的字節(jié)碼僅包含普通的類,接口和方法。 為什么要使用泛型程序設(shè)計? 一般的類和方法,只能使用具體的類型:要么是基本類型,要么是自定義類的對應(yīng)類型;如果要編寫可以應(yīng)用于多種類型的代碼,這種刻板的限制對代碼的束縛就會很大。----摘自原書Ordinary classes and meth...
摘要:抽象類和抽象方法抽象方法這種方法是不完整的,僅有聲明而沒有方法。創(chuàng)建抽象類和抽象方法非常有用,因為他們可以使累的抽象性明確起來,并告訴用戶和編譯器打算怎樣來使用它們。接口用于建立類于類之間的協(xié)議。與抽象類相同,防止客戶端程序員創(chuàng)建該類對象。 點擊進入我的博客 接口和內(nèi)部類為我們提供了一種將接口與實現(xiàn)分離的更加結(jié)構(gòu)化的方法。 9.1抽象類和抽象方法 抽象方法:這種方法是不完整的,僅有...
摘要:類圖相關(guān)的設(shè)計模式享元模式和代理模式當(dāng)代理模式消耗性能比較大的時候,就可以用享元模式享元模式和單例模式容器單例,享元模式就是復(fù)用對象的思想。源碼中的享元模式源碼地址享元模式參考慕課網(wǎng)設(shè)計模式精講設(shè)計模式讀書筆記享元模式 0x01.定義與類型 定義:提供了減少對象數(shù)量從而改善應(yīng)用所需的對象結(jié)構(gòu)的方法,系統(tǒng)使用少量對象,而且這些都比較相似,狀態(tài)變化小,可以實現(xiàn)對象的多次復(fù)用。 運用共享技...
摘要:時間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。這對所有形態(tài)的工廠模式都是重要的這個系統(tǒng)的產(chǎn)品有至少一個的產(chǎn)品族同屬于一個產(chǎn)品族的產(chǎn)品是設(shè)計成在一起使用的。 時間:2017年08月27日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.c...
摘要:參考資料程序設(shè)計北大唐大仕零基礎(chǔ)學(xué)語言浙大翁愷面向?qū)ο蟪绦蛟O(shè)計語言浙大翁愷在里面搜索可以查看和修改快捷鍵自動補全代碼格式化簡介歷史與一起發(fā)展萬維網(wǎng)所有信息用鏈接連接起來靜態(tài)網(wǎng)頁動態(tài)網(wǎng)頁的出現(xiàn)年開發(fā)工具包語法增加廣泛動態(tài)編譯腳本 參考資料 Java程序設(shè)計 - 北大 - 唐大仕 零基礎(chǔ)學(xué)Java語言 - 浙大 - 翁愷 面向?qū)ο蟪绦蛟O(shè)計——Java語言 - 浙大 - 翁愷 Ecl...
閱讀 5030·2021-09-07 09:58
閱讀 781·2019-08-30 15:55
閱讀 2909·2019-08-30 15:55
閱讀 915·2019-08-30 15:53
閱讀 1549·2019-08-29 12:57
閱讀 1796·2019-08-26 13:46
閱讀 558·2019-08-26 11:00
閱讀 3657·2019-08-23 15:42