關(guān)于JAVA匿名內部類(lèi),回調,事件模式的一點(diǎn)討論 VS dotNET事件模式
關(guān)于JAVA匿名內部類(lèi)的一點(diǎn)討論.
基本理論:
-----------------------------------------------------
關(guān)于JAVA內部類(lèi):一個(gè)內部類(lèi)的定義是定義在另一個(gè)類(lèi)內部的類(lèi)。
存在它的原因是:
1.一個(gè)內部類(lèi)的對象能夠訪(fǎng)問(wèn)創(chuàng )建它的對象的實(shí)現,包括私有數據。即內部類(lèi)實(shí)例對包含它的哪個(gè)類(lèi)的實(shí)例來(lái)說(shuō),是特權的。
2.對于同一個(gè)包中的其他類(lèi)來(lái)說(shuō),內部類(lèi)能夠隱藏起來(lái),換句話(huà)說(shuō),內部類(lèi)不管方法的可見(jiàn)性如何,那怕是public,除了包容類(lèi),其他類(lèi)都無(wú)法使用它。
3.匿名內部類(lèi)可以很方便的定義回調。
4.使用內部類(lèi)可以非常方便的編寫(xiě)事件驅動(dòng)程序。
其實(shí)它真正的目的僅僅為了定義回調--進(jìn)一步就是事件驅動(dòng)。
接口和回調:編程一個(gè)常用的模式是回調模式,在這種模式中你可以指定當一個(gè)特定時(shí)間發(fā)生時(shí)回調對象上的方法。
--------------------------------------------------
注意事項:
匿名類(lèi)和內部類(lèi)中的中的this :
有時(shí)候,我們會(huì )用到一些內部類(lèi)和匿名類(lèi)。當在匿名類(lèi)中用this時(shí),這個(gè)this則指的是匿名類(lèi)或內部類(lèi)本身。
這時(shí)如果我們要使用外部類(lèi)的方法和變量的話(huà),則應該加上外部類(lèi)的類(lèi)名。如下面這個(gè)例子:






























在上面這個(gè)例子中, thread 是一個(gè)匿名類(lèi)對象,在它的定義中,它的 run 函數里用到了外部類(lèi)的 run 函數。
這時(shí)由于函數同名,直接調用就不行了。這時(shí)有兩種辦法,一種就是把外部的 run 函數換一個(gè)名字,但這種辦法對于一個(gè)開(kāi)發(fā)到中途的應用來(lái)說(shuō)是不可取的
。那么就可以用這個(gè)例子中的辦法用外部類(lèi)的類(lèi)名加上 this 引用來(lái)說(shuō)明要調用的是外部類(lèi)的方法 run。
--------------------------------------------------
對于這個(gè)例子:










這個(gè)時(shí)候調用test()方法,那Inner類(lèi)的method1和method2是什么時(shí)候被調用的?難道也是this對象向他們發(fā)消息(比如傳入一個(gè)參數)嗎?還是直接顯式的調用??
對于Inner類(lèi),除了this這個(gè)類(lèi),就是this.test(...那句中的this,它能夠調用Inner類(lèi)的方法,其他地方都不行,然而,這也需要你在類(lèi)中有個(gè)地方保存有對這個(gè)內部類(lèi)實(shí)例的引用才可以。再說(shuō)明一次,內部類(lèi)是用來(lái)在某個(gè)時(shí)刻調用外面的方法而存在的--這就是回調。
為了說(shuō)明內部類(lèi)實(shí)例的方法只能在包容類(lèi)的實(shí)例中調用,其他地方無(wú)法調用,給個(gè)例子如下:
JAVA2實(shí)用教程源碼:

































------------------------------------------------
那么,如何使用內部類(lèi),匿名類(lèi)實(shí)現事件處理呢?
JAVA---事件適配器
1.事件適配器--EventAdapter
下例中采用了鼠標適配器:







java.awt.event包中定義的事件適配器類(lèi)包括以下幾個(gè):
1.ComponentAdapter( 組件適配器)
2.ContainerAdapter( 容器適配器)
3.FocusAdapter( 焦點(diǎn)適配器)
4.KeyAdapter( 鍵盤(pán)適配器)
5.MouseAdapter( 鼠標適配器)
6.MouseMotionAdapter( 鼠標運動(dòng)適配器)
7.WindowAdapter( 窗口適配器)
2. 用內部類(lèi)實(shí)現事件處理
內部類(lèi)(inner class)是被定義于另一個(gè)類(lèi)中的類(lèi),使用內部類(lèi)的主要原因是由于:
◇ 一個(gè)內部類(lèi)的對象可訪(fǎng)問(wèn)外部類(lèi)的成員方法和變量,包括私有的成員。
◇ 實(shí)現事件監聽(tīng)器時(shí),采用內部類(lèi)、匿名類(lèi)編程非常容易實(shí)現其功能。
◇ 編寫(xiě)事件驅動(dòng)程序,內部類(lèi)很方便?! ?br> 因此內部類(lèi)所能夠應用的地方往往是在A(yíng)WT的事件處理機制中。
例5.11

































3.匿名類(lèi)(Anonymous Class)
當一個(gè)內部類(lèi)的類(lèi)聲名只是在創(chuàng )建此類(lèi)對象時(shí)用了一次,而且要產(chǎn)生的新類(lèi)需繼承于一個(gè)已有的父類(lèi)或實(shí)現一個(gè)接口,才能考慮用匿名類(lèi),由于匿名類(lèi)本身無(wú)名,因此它也就不存在構造方法,它需要顯示地調用一個(gè)無(wú)參的父
類(lèi)的構造方法,并且重寫(xiě)父類(lèi)的方法。所謂的匿名就是該類(lèi)連名字都沒(méi)有,只是顯示地調用一個(gè)無(wú)參的父類(lèi)的構造方法。
例5.12



























其實(shí)仔細分析,例5.11和5.12實(shí)現的都是完全一樣的功能,只不過(guò)采取的方式不同。5.11中的事件處理類(lèi)是一個(gè)內部類(lèi),而5.12的事件處理類(lèi)是匿名類(lèi),可以說(shuō)從類(lèi)的關(guān)系來(lái)說(shuō)是越來(lái)越不清楚,但
是程序也越來(lái)越簡(jiǎn)練。熟悉這兩種方式也十分有助于編寫(xiě)圖形界面的程序。
親自在IDE中實(shí)踐一下,會(huì )理解的更深切一點(diǎn)。
然而,在.NET中實(shí)現事件模式,就要簡(jiǎn)單的多,這樣的文章很多,不過(guò)也不妨繼續討論討論。

posted on 2004-09-11 13:45 海天一鷗 閱讀(3738) 評論(9) 編輯 收藏 收藏至365Key 所屬分類(lèi): JAVA技術(shù)

