這篇文章主要講解了“java中staticclass靜態(tài)類(lèi)的實(shí)例介紹”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“java中staticclass靜態(tài)類(lèi)的實(shí)例介紹”吧!
十年的城關(guān)網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷(xiāo)型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整城關(guān)建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“城關(guān)網(wǎng)站設(shè)計(jì)”,“城關(guān)網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
一般情況下是不可以用static修飾類(lèi)的。如果一定要用static修飾類(lèi)的話,通常static修飾的是匿名內(nèi)部類(lèi)。
在一個(gè)類(lèi)中創(chuàng)建另外一個(gè)類(lèi),叫做成員內(nèi)部類(lèi)。這個(gè)成員內(nèi)部類(lèi)可以靜態(tài)的(利用static關(guān)鍵字修飾),也可以是非靜態(tài)的。由于靜態(tài)的內(nèi)部類(lèi)在定義、使用的時(shí)候會(huì)有種種的限制。所以在實(shí)際工作中用到的并不多。
在開(kāi)發(fā)過(guò)程中,內(nèi)部類(lèi)中使用的最多的還是非靜態(tài)地成員內(nèi)部類(lèi)。不過(guò)在特定的情況下,靜態(tài)內(nèi)部類(lèi)也能夠發(fā)揮其獨(dú)特的作用。
一、靜態(tài)內(nèi)部類(lèi)的使用目的。
在定義內(nèi)部類(lèi)的時(shí)候,可以在其前面加上一個(gè)權(quán)限修飾符static。此時(shí)這個(gè)內(nèi)部類(lèi)就變?yōu)榱遂o態(tài)內(nèi)部類(lèi)。不過(guò)由于種種的原因,如使用上的限制等等因素(具體的使用限制,筆者在下面的內(nèi)容中會(huì)詳細(xì)闡述),在實(shí)際工作中用的并不是很多。但是并不是說(shuō)其沒(méi)有價(jià)值。在某些特殊的情況下,少了這個(gè)靜態(tài)內(nèi)部類(lèi)還真是不行。如在進(jìn)行代碼程序測(cè)試的時(shí)候,如果在每一個(gè)Java源文件中都設(shè)置一個(gè)主方法(主方法是某個(gè)應(yīng)用程序的入口,必須具有),那么會(huì)出現(xiàn)很多額外的代碼。而且最主要的時(shí)這段主程序的代碼對(duì)于Java文件來(lái)說(shuō),只是一個(gè)形式,其本身并不需要這種主方法。但是少了這個(gè)主方法又是萬(wàn)萬(wàn)不行的。在這種情況下,就可以將主方法寫(xiě)入到靜態(tài)內(nèi)部類(lèi)中,從而不用為每個(gè)Java源文件都設(shè)置一個(gè)類(lèi)似的主方法。這對(duì)于代碼測(cè)試是非常有用的。在一些中大型的應(yīng)用程序開(kāi)發(fā)中,則是一個(gè)常用的技術(shù)手段。為此,這個(gè)靜態(tài)內(nèi)部類(lèi)雖然不怎么常用,但是程序開(kāi)發(fā)人員還必須要掌握它。也許在某個(gè)關(guān)鍵的時(shí)刻,其還可以發(fā)揮巨大的作用也說(shuō)不定。
public class MainInStaticClass { static class Main{ static void main() { //將主方法寫(xiě)到靜態(tài)內(nèi)部類(lèi)中,從而不必為每個(gè)源文件都這種一個(gè)類(lèi)似的主方法 new MainInStaticClass().print(); } } public static void main(String[] args){ new MainInStaticClass().print(); } public void print(){ System.out.println("main in static inner class"); } } public class TestMain { public static void main(String[] args) { // TODO Auto-generated method stub // new MainInStaticClass().print(); MainInStaticClass.Main.main(); new MainInStaticClass.Main(); } }
二、靜態(tài)內(nèi)部類(lèi)的使用限制。
將某個(gè)內(nèi)部類(lèi)定義為靜態(tài)類(lèi),跟將其他類(lèi)定義為靜態(tài)類(lèi)的方法基本相同,引用規(guī)則也基本一致。不過(guò)其細(xì)節(jié)方面仍然有很大的不同。具體來(lái)說(shuō),主要有如下幾個(gè)地方要引起各位程序開(kāi)發(fā)人員的注意。
一是靜態(tài)成員(包括靜態(tài)變量與靜態(tài)成員)的定義。一般情況下,如果一個(gè)內(nèi)部類(lèi)不是被定義成靜態(tài)內(nèi)部類(lèi),那么在定義成員變量或者成員方法的時(shí)候,是不能夠被定義成靜態(tài)成員變量與靜態(tài)成員方法的。也就是說(shuō),在非靜態(tài)內(nèi)部類(lèi)中不可以聲明靜態(tài)成員。如現(xiàn)在在一個(gè)student類(lèi)中定義了一個(gè)內(nèi)部類(lèi)age,如果沒(méi)有將這個(gè)類(lèi)利用static關(guān)鍵字修飾,即沒(méi)有定義為靜態(tài)類(lèi),那么在這個(gè)內(nèi)部類(lèi)中如果要利用static關(guān)鍵字來(lái)修飾某個(gè)成員方法或者成員變量是不允許的。在編譯的時(shí)候就通不過(guò)。故程序開(kāi)發(fā)人員需要注意,只有將某個(gè)內(nèi)部類(lèi)修飾為靜態(tài)類(lèi),然后才能夠在這個(gè)類(lèi)中定義靜態(tài)的成員變量與成員方法。這是靜態(tài)內(nèi)部類(lèi)都有的一個(gè)特性。也正是因?yàn)檫@個(gè)原因,有時(shí)候少了這個(gè)靜態(tài)的內(nèi)部類(lèi),很多工作就無(wú)法完成。或者說(shuō)要繞一個(gè)大圈才能夠?qū)崿F(xiàn)某個(gè)用戶的需求。這也是靜態(tài)的內(nèi)部類(lèi)之所以要存在的一個(gè)重要原因。
二是在成員的引用上,有比較大的限制。一般的非靜態(tài)內(nèi)部類(lèi),可以隨意的訪問(wèn)外部類(lèi)中的成員變量與成員方法。即使這些成員方法被修飾為private(私有的成員變量或者方法),其非靜態(tài)內(nèi)部類(lèi)都可以隨意的訪問(wèn)。則是非靜態(tài)內(nèi)部類(lèi)的特權(quán)。因?yàn)樵谄渌?lèi)中是無(wú)法訪問(wèn)被定義為私有的成員變量或則方法。但是如果一個(gè)內(nèi)部類(lèi)被定義為靜態(tài)的,那么在銀用外部類(lèi)的成員方法或則成員變量的時(shí)候,就會(huì)有諸多的限制。如不能夠從靜態(tài)內(nèi)部類(lèi)的對(duì)象中訪問(wèn)外部類(lèi)的非靜態(tài)成員(包括成員變量與成員方法)。這是什么意思呢?如果在外部類(lèi)中定義了兩個(gè)變量,一個(gè)是非靜態(tài)的變量,一個(gè)是靜態(tài)的變量。那么在靜態(tài)內(nèi)部類(lèi)中,無(wú)論在成員方法內(nèi)部還是在其他地方,都只能夠引用外部類(lèi)中的靜態(tài)的變量,而不能夠訪問(wèn)非靜態(tài)的變量。在靜態(tài)內(nèi)部類(lèi)中,可以定義靜態(tài)的方法(也只有在靜態(tài)的內(nèi)部類(lèi)中可以定義靜態(tài)的方法),在靜態(tài)方法中引用外部類(lèi)的成員。但是無(wú)論在內(nèi)部類(lèi)的什么地方引用,有一個(gè)共同點(diǎn),即都只能夠引用外部類(lèi)中的靜態(tài)成員方法或者成員變量。對(duì)于那些非靜態(tài)的成員變量與成員方法,在靜態(tài)內(nèi)部類(lèi)中是無(wú)法訪問(wèn)的。這就是靜態(tài)內(nèi)部類(lèi)的最大使用限制。在普通的非靜態(tài)內(nèi)部類(lèi)中是沒(méi)有這個(gè)限制的。也正是這個(gè)原因,決定了靜態(tài)內(nèi)部類(lèi)只應(yīng)用在一些特定的場(chǎng)合。其應(yīng)用范圍遠(yuǎn)遠(yuǎn)沒(méi)有像非靜態(tài)的內(nèi)部類(lèi)那樣廣泛。
三是在創(chuàng)建靜態(tài)內(nèi)部類(lèi)時(shí)不需要將靜態(tài)內(nèi)部類(lèi)的實(shí)例綁定在外部類(lèi)的實(shí)例上。
通常情況下,在一個(gè)類(lèi)中創(chuàng)建成員內(nèi)部類(lèi)的時(shí)候,有一個(gè)強(qiáng)制性的規(guī)定,即內(nèi)部類(lèi)的實(shí)例一定要綁定在外部類(lèi)的實(shí)例中。也就是說(shuō),在創(chuàng)建內(nèi)部類(lèi)之前要先在外部類(lèi)中要利用new關(guān)鍵字來(lái)創(chuàng)建這個(gè)內(nèi)部類(lèi)的對(duì)象。如此的話如果從外部類(lèi)中初始化一個(gè)內(nèi)部類(lèi)對(duì)象,那么內(nèi)部類(lèi)對(duì)象就會(huì)綁定在外部類(lèi)對(duì)象上。也就是說(shuō),普通非靜態(tài)內(nèi)部類(lèi)的對(duì)象是依附在外部類(lèi)對(duì)象之中的。但是,如果成員開(kāi)發(fā)人員創(chuàng)建的時(shí)靜態(tài)內(nèi)部類(lèi),那么這就又另當(dāng)別論了。通常情況下,程序員在定義靜態(tài)內(nèi)部類(lèi)的時(shí)候,是不需要定義綁定在外部類(lèi)的實(shí)例上的。也就是說(shuō),要在一個(gè)外部類(lèi)中定義一個(gè)靜態(tài)的內(nèi)部類(lèi),不需要利用關(guān)鍵字new來(lái)創(chuàng)建內(nèi)部類(lèi)的實(shí)例。即在創(chuàng)建靜態(tài)類(lèi)內(nèi)部對(duì)象時(shí),不需要其外部類(lèi)的對(duì)象。
newMainInStaticClass.Main();
具體為什么會(huì)這樣,一般程序開(kāi)發(fā)人員不需要了解這么深入,只需要記住有這個(gè)規(guī)則即可。在定義靜態(tài)內(nèi)部類(lèi)的時(shí)候,千萬(wàn)不要犯畫(huà)蛇添足的錯(cuò)誤。
從以上的分析中可以看出,靜態(tài)內(nèi)部類(lèi)與非靜態(tài)的內(nèi)部類(lèi)還是有很大的不同的。一般程序開(kāi)發(fā)人員可以這么理解,非靜態(tài)的內(nèi)部類(lèi)對(duì)象隱式地在外部類(lèi)中保存了一個(gè)引用,指向創(chuàng)建它的外部類(lèi)對(duì)象。不管這么理解,程序開(kāi)發(fā)人員都需要牢記靜態(tài)內(nèi)部類(lèi)與非靜態(tài)內(nèi)部類(lèi)的差異。如是否可以創(chuàng)建靜態(tài)的成員方法與成員變量(靜態(tài)內(nèi)部類(lèi)可以創(chuàng)建靜態(tài)的成員而非靜態(tài)的內(nèi)部類(lèi)不可以)、對(duì)于訪問(wèn)外部類(lèi)的成員的限制(靜態(tài)內(nèi)部類(lèi)只可以訪問(wèn)外部類(lèi)中的靜態(tài)成員變量與成員方法而非靜態(tài)的內(nèi)部類(lèi)即可以訪問(wèn)靜態(tài)的也可以訪問(wèn)非靜態(tài)的外部類(lèi)成員方法與成員變量)。這兩個(gè)差異是靜態(tài)內(nèi)部類(lèi)與非靜態(tài)外部類(lèi)最大的差異,也是靜態(tài)內(nèi)部類(lèi)之所以存在的原因。了解了這個(gè)差異之后,程序開(kāi)發(fā)人員還需要知道,在什么情況下該使用靜態(tài)內(nèi)部類(lèi)。如在程序測(cè)試的時(shí)候,為了避免在各個(gè)Java源文件中書(shū)寫(xiě)主方法的代碼,可以將主方法寫(xiě)入到靜態(tài)內(nèi)部類(lèi)中,以減少代碼的書(shū)寫(xiě)量,讓代碼更加的簡(jiǎn)潔。
總之,靜態(tài)內(nèi)部類(lèi)在Java語(yǔ)言中是一個(gè)很特殊的類(lèi),跟普通的靜態(tài)類(lèi)以及非靜態(tài)的內(nèi)部類(lèi)都有很大的差異。作為程序開(kāi)發(fā)人員,必須要知道他們之間的差異,并在實(shí)際工作中在合適的地方采用合適的類(lèi)。不過(guò)總的來(lái)說(shuō),靜態(tài)內(nèi)部類(lèi)的使用頻率并不是很高。但是在有一些場(chǎng)合,如果沒(méi)有這個(gè)內(nèi)部靜態(tài)類(lèi)的話,可能會(huì)起到事倍功半的反面效果
三、實(shí)例化
看了以上內(nèi)容后,下面我整體測(cè)試了一下:
首先大家需要明白,靜態(tài)內(nèi)部類(lèi)只是不依附與外部類(lèi),它里面的變量和方法也沒(méi)有說(shuō)一定得是靜態(tài)的,下面拿代碼說(shuō)事:
public class Test { public static void main(String[] args){ MyInnerStaticClass inner=new MyInnerStaticClass(); inner.a=10; inner.b="abc"; System.out.println(inner.a+" "+inner.b); } static class MyInnerStaticClass{ int a; String b; } }
public class Test { public static void main(String[] args){ MyInnerStaticClass inner=new MyInnerStaticClass(); inner.a=10; inner.b="abc"; System.out.println(inner.a+" "+inner.b); } static class MyInnerStaticClass{ int a; String b; } }
上述代碼將靜態(tài)匿名類(lèi)用new實(shí)例化了,運(yùn)行后輸入10 abc,正確!
感謝各位的閱讀,以上就是“java中staticclass靜態(tài)類(lèi)的實(shí)例介紹”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)java中staticclass靜態(tài)類(lèi)的實(shí)例介紹這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!