為了盡可能闡述清楚這個問題旋奢,我會從一下幾個方向說明這個問題:
1泳挥、 測試用例
* 測試非靜態(tài)內(nèi)部類如何理解然痊?
* 測試非靜態(tài)內(nèi)部類定義靜態(tài)成員是否合法至朗?
* 測試非靜態(tài)內(nèi)部類是否可以定義靜態(tài)常量?
a剧浸、定義字面常量
b锹引、定義動態(tài)常量
2、 測試結(jié)果
3唆香、 探究緣由
測試方案:
測試非靜態(tài)內(nèi)部類如何理解嫌变?
代碼用例:
結(jié)論:我們理解非靜態(tài)內(nèi)部類時,可以看作是一個外部類的一個非靜態(tài)成員躬它,那么其實非靜態(tài)內(nèi)部類就是隸屬于外部類對象的腾啥,但是它就其本質(zhì)還是一個類。只要把握住這個兩個核心接下來的內(nèi)容就很好理解了冯吓。所以這也是為什么在TestInner類中測試使用Inner時倘待,我門需要創(chuàng)建外部類對象之后才能使用內(nèi)部類對象,因為:
??內(nèi)部類是屬于外部類對象的组贺,其次內(nèi)部類的非靜態(tài)內(nèi)容訪問也需要內(nèi)部類對象凸舵,所以要new 外部類.new 內(nèi)部類
測試方案:
測試非靜態(tài)內(nèi)部類定義靜態(tài)成員是否合法?
代碼用例:
結(jié)論:我們在測試在非靜態(tài)內(nèi)部類中說明靜態(tài)內(nèi)容時失尖,會直接報錯啊奄,此時這是為什么呢渐苏?
第一:java虛擬機(jī)要求所有的靜態(tài)變量在類加載過程中的初始化階段將符號引用變?yōu)橹苯右谩N覀兒唵慰梢岳斫鉃椋?strong>此時還沒有對象呢菇夸!那么這也意味著我在內(nèi)部類中定義的靜態(tài)內(nèi)容琼富,要先于內(nèi)部類對象存在。因為它是類層面上的
第二:由于內(nèi)部類時依附于外部類對象的庄新,那么也就意味著內(nèi)部類中的內(nèi)容時依附于外部類的對象的公黑。但是內(nèi)部類中的靜態(tài)內(nèi)容是不需要實例就可以,上述第一條已經(jīng)說過了摄咆,但是由于第二條我們剛說的內(nèi)部類時依附于外部類的凡蚜,也就意味著內(nèi)部類無法做到在沒有外部類實例的情況下而直接使用,所以和我們剛寫的第一條相悖吭从。
所以在非靜態(tài)內(nèi)部類中不能定義靜態(tài)內(nèi)容【這句話不全對朝蜘,我們繼續(xù)往下看】
測試方案:
測試非靜態(tài)內(nèi)部類是否可以定義靜態(tài)常量?【編譯期常量】
代碼用例:
測試結(jié)果:
結(jié)論:我們是可以在非靜態(tài)內(nèi)部類中定義靜態(tài)常量的【這里要注意靜態(tài)常量一定擁有一個編譯期常量的】
第一:根據(jù)上面的測試用例2涩金,我們總結(jié)的結(jié)論谱醇,繼續(xù)向下推導(dǎo)。為什么在非靜態(tài)內(nèi)部類中常量是可以被static修飾的步做。這里要注意副渴,num這個變量被final static修飾后,由于所賦值為字面常量全度,而此時字面常量會在編譯階段確定值煮剧,我們將這樣的常量稱之為編譯期常量,而編譯期常量是不需要加載類的字節(jié)碼文件的将鸵,很多書上將這一步稱之為編譯期常量折疊【編譯器在編譯階段通過語法分析計算出常量表達(dá)式的具體值】勉盅。
第二:通過上一步的理解,我們也可以這樣說顶掉,編譯期常量不會導(dǎo)致類加載草娜,那么基于這一條,我們就可以理解為什么靜態(tài)常量在非靜態(tài)內(nèi)部類中定義是合法的痒筒。
測試方案:
測試非靜態(tài)內(nèi)部類是否可以定義靜態(tài)常量宰闰?【運(yùn)行期常量】
代碼用例:
思考:為什么用
Math.random();
就不行了呢?結(jié)論:其實這里的原因就是和測試用例2和測試用例3結(jié)合起來的簿透。因為此時這里賦值不在時編譯期常量移袍,而是非編譯期常量,對于這樣的值而言編譯期無法折疊編譯器只能做一些語法檢查萎战,比如該常量之是否在其他地方做了修改等咐容。。蚂维。既然無法確定值戳粒,那么就會導(dǎo)致該常量值的確定需要類被加載時確定路狮,其實也和我們測試用例2一樣,就會報錯蔚约。
所以非靜態(tài)內(nèi)部類中不能擁有靜態(tài)成員變量/方法奄妨,但是可以有靜態(tài)的編譯期常量,不能使用非編譯期常量苹祟。通過這個我們也可以理解為什么有些類中定義的字符串會通過static final修飾了砸抛。無需導(dǎo)致類加載,在一定程度上降低了內(nèi)存消耗树枫。
版權(quán)聲明:本文為原創(chuàng)文章直焙,未經(jīng)博主允許不責(zé)轉(zhuǎn)載。
地址:http://www.reibang.com/p/4dbe68850e1b