將某個(gè)內(nèi)部類定義為靜態(tài)類,跟將其他類定義為靜態(tài)類的方法基本相同,引用規(guī)則也基本一致。不過其細(xì)節(jié)方面仍然有很大的不同。具體來說,主要有如下幾個(gè)地方要引起各位程序開發(fā)人員的注意。
一是靜態(tài)成員(包括靜態(tài)變量與靜態(tài)成員)的定義。一般情況下,如果一個(gè)內(nèi)部類不是被定義成靜態(tài)內(nèi)部類,那么在定義成員變量或者成員方法的時(shí)候,是不能夠被定義成靜態(tài)成員變量與靜態(tài)成員方法的。也就是說,在非靜態(tài)內(nèi)部類中不可以聲明靜態(tài)成員。如現(xiàn)在在一個(gè)student類中定義了一個(gè)內(nèi)部類age,如果沒有將這個(gè)類利用static關(guān)鍵字修飾,即沒有定義為靜態(tài)類,那么在這個(gè)內(nèi)部類中如果要利用static關(guān)鍵字來修飾某個(gè)成員方法或者成員變量是不允許的。在編譯的時(shí)候就通不過。故程序開發(fā)人員需要注意,只有將某個(gè)內(nèi)部類修飾為靜態(tài)類,然后才能夠在這個(gè)類中定義靜態(tài)的成員變量與成員方法。這是靜態(tài)內(nèi)部類都有的一個(gè)特性。也正是因?yàn)檫@個(gè)原因,有時(shí)候少了這個(gè)靜態(tài)的內(nèi)部類,很多工作就無法完成。或者說要繞一個(gè)大圈才能夠?qū)崿F(xiàn)某個(gè)用戶的需求。這也是靜態(tài)的內(nèi)部類之所以要存在的一個(gè)重要原因。
二是在成員的引用上,有比較大的限制。一般的非靜態(tài)內(nèi)部類,可以隨意的訪問外部類中的成員變量與成員方法。即使這些成員方法被修飾為private(私有的成員變量或者方法),其非靜態(tài)內(nèi)部類都可以隨意的訪問。則是非靜態(tài)內(nèi)部類的特權(quán)。因?yàn)樵谄渌愔惺菬o法訪問被定義為私有的成員變量或則方法。但是如果一個(gè)內(nèi)部類被定義為靜態(tài)的,那么在引用外部類的成員方法或則成員變量的時(shí)候,就會(huì)有諸多的限制。如不能夠從靜態(tài)內(nèi)部類的對(duì)象中訪問外部類的非靜態(tài)成員(包括成員變量與成員方法)。這是什么意思呢? 如果在外部類中定義了兩個(gè)變量,一個(gè)是非靜態(tài)的變量,一個(gè)是靜態(tài)的變量。那么在靜態(tài)內(nèi)部類中,無論在成員方法內(nèi)部還是在其他地方,都只能夠引用外部類中的靜態(tài)的變量,而不能夠訪問非靜態(tài)的變量。在靜態(tài)內(nèi)部類中,可以定義靜態(tài)的方法(也只有在靜態(tài)的內(nèi)部類中可以定義靜態(tài)的方法),在靜態(tài)方法中引用外部類的成員。但是無論在內(nèi)部類的什么地方引用,有一個(gè)共同點(diǎn),即都只能夠引用外部類中的靜態(tài)成員方法或者成員變量。對(duì)于那些非靜態(tài)的成員變量與成員方法,在靜態(tài)內(nèi)部類中是無法訪問的。這就是靜態(tài)內(nèi)部類的最大使用限制。在普通的非靜態(tài)內(nèi)部類中是沒有這個(gè)限制的。也正是這個(gè)原因,決定了靜態(tài)內(nèi)部類只應(yīng)用在一些特定的場(chǎng)合。其應(yīng)用范圍遠(yuǎn)遠(yuǎn)沒有像非靜態(tài)的內(nèi)部類那樣廣泛。
三是在創(chuàng)建靜態(tài)內(nèi)部類時(shí)不需要將靜態(tài)內(nèi)部類的實(shí)例綁定在外部類的實(shí)例上。
通常情況下,在一個(gè)類中創(chuàng)建成員內(nèi)部類的時(shí)候,有一個(gè)強(qiáng)制性的規(guī)定,即內(nèi)部類的實(shí)例一定要綁定在外部類的實(shí)例中。也就是說,在創(chuàng)建內(nèi)部類之前要先在外部類中要利用new關(guān)鍵字來創(chuàng)建這個(gè)內(nèi)部類的對(duì)象。如此的話如果從外部類中初始化一個(gè)內(nèi)部類對(duì)象,那么內(nèi)部類對(duì)象就會(huì)綁定在外部類對(duì)象上。也就是說,普通非靜態(tài)內(nèi)部類的對(duì)象是依附在外部類對(duì)象之中的。但是,如果成員開發(fā)人員創(chuàng)建的時(shí)靜態(tài)內(nèi)部類,那么這就又另當(dāng)別論了。通常情況下,程序員在定義靜態(tài)內(nèi)部類的時(shí)候,是不需要定義綁定在外部類的實(shí)例上的。也就是說,要在一個(gè)外部類中定義一個(gè)靜態(tài)的內(nèi)部類,不需要利用關(guān)鍵字new來創(chuàng)建內(nèi)部類的實(shí)例。即在創(chuàng)建靜態(tài)類內(nèi)部對(duì)象時(shí),不需要其外部類的對(duì)象。具體為什么會(huì)這樣,一般程序開發(fā)人員不需要了解這么深入,只需要記住有這個(gè)規(guī)則即可。在定義靜態(tài)內(nèi)部類的時(shí)候,千萬不要犯畫蛇添足的錯(cuò)誤。
從以上的分析中可以看出,靜態(tài)內(nèi)部類與非靜態(tài)的內(nèi)部類還是有很大的不同的。一般程序開發(fā)人員可以這么理解,非晶態(tài)的內(nèi)部類對(duì)象隱式地在外部類中保存了一個(gè)引用,指向創(chuàng)建它的外部類對(duì)象。不管這么理解,程序開發(fā)人員都需要牢記靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類的差異。如是否可以創(chuàng)建靜態(tài)的成員方法與成員變量(靜態(tài)內(nèi)部類可以創(chuàng)建靜態(tài)的成員而非靜態(tài)的內(nèi)部類不可以)、對(duì)于訪問外部類的成員的限制(靜態(tài)內(nèi)部類只可以訪問外部類中的靜態(tài)成員變量與成員方法而非靜態(tài)的內(nèi)部類即可以訪問靜態(tài)的也可以訪問非靜態(tài)的外部類成員方法與成員變量)。這兩個(gè)差異是靜態(tài)內(nèi)部類與非靜態(tài)外部類最大的差異,也是靜態(tài)內(nèi)部類之所以存在的原因。了解了這個(gè)差異之后,程序開發(fā)人員還需要知道,在什么情況下該使用靜態(tài)內(nèi)部類。如在程序測(cè)試的時(shí)候,為了避免在各個(gè) Java源文件中書寫主方法的代碼,可以將主方法寫入到靜態(tài)內(nèi)部類中,以減少代碼的書寫量,讓代碼更加的簡(jiǎn)潔。
總之,靜態(tài)內(nèi)部類在Java語言中是一個(gè)很特殊的類,跟普通的靜態(tài)類以及非靜態(tài)的內(nèi)部類都有很大的差異。作為程序開發(fā)人員,必須要知道他們之間的差異,并在實(shí)際工作中在合適的地方采用合適的類。不過總的來說,靜態(tài)內(nèi)部類的使用頻率并不是很高。但是在有一些場(chǎng)合,如果沒有這個(gè)內(nèi)部靜態(tài)類的話,可能會(huì)起到事倍功半的反面效果。
![]() | ![]() .. 定價(jià):¥45 優(yōu)惠價(jià):¥42 更多書籍 |
![]() | ![]() .. 定價(jià):¥225 優(yōu)惠價(jià):¥213 更多書籍 |