8:接口(interface)與內部類(inner class)
接口(interface)
可以把它想象成“純的”abstract類。能讓開發人員定義類的形式:方法名,參數列表,返回值的類型,但是卻沒有方法的正文。interface也可以包含數據成員,但是它天生就是static和final的。interface只提供形式,不談實現。
interface會被用作定義類之間的“協議(protocol)”。
當你implements一個interface的時候,你必須把這個interface的方法定義成public的。如果你不這么做,那它就會編程package權限的,這樣經過繼承,這些方法的訪問權限就會收到限制,而這是Java的編譯器所不允許的。
Java的“多重繼承(multiple inheritance)”。
只要基類的設計里面可以不包括方法合成員變量的定義,你就應該優先使用interface。只有在不得不定義方法或成員變量的情況下,你才能把它改成abstract類,或者根據需要改成實體類。
合并接口時的名字沖突
用繼承擴展interface
你可以用繼承,往interface里面添加新的方法,也可以用繼承把多個interface合并成一個新的interface。在這兩種情況下,你所得到的都只是一個新的interface。
常量的分組
由于interface的數據成員自動就是static和final的,因此interface是一種非常方便的,創建一組常量值的工具。
interface的成員自動就是public的。
初始化接口中的數據成員
接口的嵌套
內部類
內部類與上傳
實際上,將對象上傳給它所實現的接口與將它上傳給基類是完全相同。
普通類(非內部類)是不能被定義成private或protected的;它們只可能是public或package權限的。
在方法和作用域里的內部類
匿名內部類
如果你在定義匿名內部類的時候,還要用到外面的對象,那編譯就會要求你把這個參數的reference生命成final的。如果你忘了,編譯的時候就會報錯。
實際上實力初始化過程就是匿名內部類的構造函數。當然,它的功能是有限的:你不能重載實例初始化,因此你只能有一個構造函數。
與宿主類的關系
如果你創建了一個內部類,那么這個內部類的對象,就與創建它的“宿主類的對象(enclosing object)”產生了某種關系,這樣它就能訪問宿主類對象的成員了--不需要任何特別的授權。此外,內部類還能訪問宿主類的所有元素。
嵌套類
如果你不需要這種“內部類對象和宿主類對象之間的”聯系,那么你可以把內部類定義成static的。這通常被稱作“嵌套類(nested class)”。嵌套類的意思是:
1。無須宿主類的對象就能創建嵌套類的對象。
2。不能在嵌套類的對象里面訪問非static的宿主類對象。
interface里面是不能有任何代碼的,但嵌套類卻可以是interface的一部分。
引用宿主類的對象
除非你還已經創建了宿主類的對象,否則根本不可能創建內部類的對象。但是,如果你創建的是嵌套類(static的內部類)的話,那就不需要宿主類對象的reference了。
在多層潛逃的類里向外訪問
當你在另一個類里創建多層嵌套的內部類的對象的時候,應當使用哪種語法。“.new”語句指明了正確的作用域,因此你無須在調用構造函數的語句里再去限定類的名字了。
繼承內部類
你必須傳給他宿主類對象的reference。此外,你還必須在構造函數里面使用這種語法:
enclosingClassReference.super();
內部類可以被覆寫嗎?
當你繼承宿主類的時候,內部類的戲法就到此為止了。這兩個內部類是相互肚里的兩個實體,它們都有自己的名字空間。
本地內部類(Local inner classes)
用本地內部類來代替匿名內部類的唯一正當的理由就是,你需要一個有名字的構造函數,并且/或者要重載這個構造函數,因為匿名內部類只能進行實力初始化。
選擇本地內部類而不是匿名內部類的唯一原因就是,你必須創建多個那種類的對象。
內部類的標識符(Inner class identifiers)
為什么要有內部類?
每個內部類都可以獨立地繼承某個“實現(implementation)”。因此,內部類不會受“宿主類是否已經繼承了別的實現”的約束。
有了內部類,你就得到了如下的附加特性:
1。內部類可以有多個實例,而每個又都可以有它自己的,與宿主類對象無關的狀態信息。
2。一個宿主類里可以放上好幾個內部類,他們可以用各自不同的方法來實現同一個interface或繼承同一個類。
3。內部類對象創建的時機與宿主類對象的創建沒什么關系。
4。內部類不存在什么讓人頭暈的“是”關系;他是一個獨立的實體。
Closure與回調(Closures & Callbacks)
closure是一種能調用的對象,它記錄了創建它的那個作用域的信息。內部類就是一種面向對象的closure,因為它不僅保存了宿主類的所有信息(“創建它的作用域”),而且還自動保存指向那個宿主類的對象的reference,更何況它還有權操控這個對象的所有成員,即使他們是private 的。
內部類與控制框架(Inner classes & control frameworks)
“應用程序框架(application framework)”是一個或一組為解決某種特定類型的問題而設計的類。控制框架是應用程序框架的一種,主要用于響應時間;如果系統的首要人物就是對事件作出響應,那么它就被稱為“事件驅動系統(event-driven system)”。
總結:相比絕大多數別的OOP語言,接口和內部類的概念會更為復雜,但是和C++的MI相比,JAVA的接口和內部類還是簡單的許多。雖然,這些特性本身還是比較簡單,但是它們具體用法就屬于設計的范疇了,這點同多態性非常相似。
2005年03月15日 3:29 PM