1. 程式人生 > >內部類2——為什麽需要內部類?

內部類2——為什麽需要內部類?

影響 會展 遍歷 沒有 獨立 運行時 相互 必須 抽象

一,為什麽需要內部類? 一般說來,內部類繼承自某個類或實現某個接口,內部類的代碼操作創建它的外圍類的對象。所以可以認為內部類提供了某種進人其外圍類的窗口。 內部類必須要回答的一個問題是:如果只是需要一個對接口的引用,為什麽不通過外圍類實現那個接口呢?答案是:“如果這能滿足需求,那麽就應該這樣做。”那麽內部類實現一個接口與外圍類實現這個接口有什麽區別呢?答案是:後者不是總能享用接口帶來的方便,有時需要用到接口的實現。所以,使用內部類最吸引人的原因是:每個內部類都能獨立地繼承自一個(接口的)實現,所以無論外圍類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響。 如果沒有內部類提供的、可以繼承多個具體的或抽象的類的能力,一 些設計 與編程問題就很難解決。從這個角度看,內部類使得多重繼承的解決方案變得完整。接口解決了部分問題,而內部類有效地實現了“多重繼承”。也就是說,內部類允許繼承多個非接口類型
(譯註:類或抽象類) 如果不需要解決“多重繼承”的問題,那麽自然可以用別的方式編碼,而不需要使用內部類。但如果使用內部類,還可以獲得其他一些特性: 1)內部類可以有多個實例,每個實例都有自己的狀態信息,並且與其外圍類對象的信息相互獨立。 2)在單個外圍類中,可以讓多個內部類以不同的方式實現同一個接口,或繼承同一個類。稍後就會展示一個這樣的例子。 3)創建內部類對象的時刻並不依賴於外圍類對象的創建。 4)內部類並沒有令人迷惑的"is-a" 關系;它就是一個獨的實體。 舉個例子,如果Sequenc.java不使用內部類,就必須聲明“Sequence是一個Selector,對於某個特定的Sequence只能有一個Selector.然而使用內部類很容易就能擁有另一個方法reverseSelector() , 用它來生成一個反方向遍歷序列的Selector.只有內部類才有這種靈活性 二,閉包 閉包是一個可調用的對象,他記錄了一些信息,這些信息來自於創建他的作用域。通過這個定義,可以看出內部類是面向對象的閉包,,因為它不僅僅包含外圍類對象的信息,還自動擁有一個指向外圍類對象的引用,在此作用域內,內部類有權操作所有的成員,包括private成員 回調的價值在於它的靈活性,在運行時狀態決定調用什麽方法 通過回調,對象能夠攜帶一些信息,這些信息允許他在某個時刻調用初始的對象

內部類2——為什麽需要內部類?