為什么使用內(nèi)部類(lèi)
我們知道,java提供了一種語(yǔ)言特性:內(nèi)部類(lèi)。一開(kāi)始接觸內(nèi)部類(lèi),感覺(jué)這種機(jī)制確實(shí)很神奇,但是轉(zhuǎn)念一想似乎這種機(jī)制又有些多余。因?yàn)槲覀兺耆梢杂猛獠款?lèi)的形式去實(shí)現(xiàn)和內(nèi)部類(lèi)相同的功能,比如我的上一篇文章中的工廠(chǎng)模式(http://blog.csdn.net/hmzdbql/article/details/7691055)。那么內(nèi)部類(lèi)到底有什么好處呢?
我們?cè)O(shè)想這樣一種情形,如果有一個(gè)類(lèi)A,一個(gè)類(lèi)B他們分別實(shí)現(xiàn)了不同的功能(注意這個(gè)時(shí)候的A,B類(lèi)都是實(shí)體類(lèi)而不是抽象類(lèi)或者接口)。現(xiàn)在我們需要寫(xiě)一個(gè)類(lèi)C,它需要使用類(lèi)A類(lèi)B中的全部功能,也就是我們通過(guò)類(lèi)C可以直接使用類(lèi)A和類(lèi)B中的方法。想想應(yīng)該如何去實(shí)現(xiàn)呢?你或許想到了繼承,的確繼承是一個(gè)很好的方式。但是很快你就會(huì)發(fā)現(xiàn)悲?。簀ava不支持多繼承...類(lèi)C不可能以繼承的方式去使用類(lèi)A和類(lèi)B中的所有方法。似乎沒(méi)轍了...其實(shí)不然,這個(gè)時(shí)候內(nèi)部類(lèi)就派上了用場(chǎng)??聪旅娴拇a:
class A { public void f() { // 方法內(nèi)容 } } class B { public void g() { // 方法內(nèi)容 } } class C extends A { B getB() { return new B() { //可以在這里擴(kuò)展B類(lèi)的方法 }; } } public class Test { public static void main(String[] args) { C c = new C(); c.f();// 調(diào)用了類(lèi)A的f()方法 c.getB().g();// 調(diào)用了類(lèi)B的g()方法 } }
通過(guò)這個(gè)例子我們看到C類(lèi)實(shí)現(xiàn)了對(duì)A,B類(lèi)方法的完全集成。我們只需要使用C類(lèi)便可以使用A,B類(lèi)中的所有方法。換言之,也就是我們使用內(nèi)部類(lèi)實(shí)現(xiàn)了多繼承....
同時(shí)使用內(nèi)部類(lèi)我們還可以得到其他一些額外的好處:我們發(fā)現(xiàn)在內(nèi)部類(lèi)中我們可以擴(kuò)展B類(lèi)的方法,這無(wú)疑是一個(gè)很大的好處。
當(dāng)然,上面的方式也可以采用別的方式實(shí)現(xiàn),而不使用內(nèi)部類(lèi)。比如我們?cè)贑類(lèi)中添加方法getA();getB()便可以分別得到A,B對(duì)象。也可以實(shí)現(xiàn)同樣的效果。但是假如我們遇到了一個(gè)必須使用多繼承才能解決的問(wèn)題,內(nèi)部類(lèi)無(wú)疑是首選也是必選。從另外一個(gè)方面,我們知道C++支持多繼承,而java不支持。很多時(shí)候會(huì)造成不便,有了內(nèi)部類(lèi)的機(jī)制支持同樣可以實(shí)現(xiàn)多繼承,算是java的另一種特性所在吧。
posted on 2015-05-08 18:18 咖啡貓1292 閱讀(259) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)