public class NullAS{ private static void a(){ System.out.println("hello word"); } public static void main(String[] args) { NullAS N = null; N.a(); } }
這段代碼最終的輸出結(jié)果是:
創(chuàng)新互聯(lián)主營(yíng)靈武網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,靈武h5微信小程序搭建,靈武網(wǎng)站營(yíng)銷推廣歡迎靈武等地區(qū)企業(yè)咨詢hello Word
有些人可能會(huì)有疑問,使用null對(duì)象調(diào)用所屬類的靜態(tài)方法,沒有報(bào)錯(cuò),還可以正常輸出
這其中就涉及到了Java的類,類成員和static
類成員包括類變量,類方法等
讓我們來看看類變量的定義:
“類變量屬于整個(gè)整個(gè)類,當(dāng)系統(tǒng)第一次準(zhǔn)備使用該類時(shí),系統(tǒng)會(huì)為該類變量分配內(nèi)存空間,類變量開始生效,直到該類被卸載,該類的類變量所占用的內(nèi)存才被系統(tǒng)的垃圾回收機(jī)制回首。類變量生存范圍幾乎等同于該類的生存范圍。當(dāng)類初始化完成后,類變量也初始化完成”
當(dāng)我們看一下上面代碼的分配內(nèi)存情況可知
當(dāng)系統(tǒng)創(chuàng)建該類的對(duì)象時(shí),系統(tǒng)不會(huì)再為類變量分配內(nèi)存,也不會(huì)再次對(duì)壘變量進(jìn)行初始化,也就是說,對(duì)象根本不擁有對(duì)應(yīng)類的類變量。通過對(duì)象訪問類變量只是一種假象。當(dāng)通過對(duì)象來訪問類變量時(shí),系統(tǒng)會(huì)在底層轉(zhuǎn)換為該類來訪問類變量。
由于對(duì)象實(shí)際上并不持有類變量,類變量時(shí)由該類持有的,同一個(gè)類的所有對(duì)象訪問類變量時(shí),實(shí)際上訪問的都是該類的類變量。從程序運(yùn)行表面來看,即可看到同一類的所有勢(shì)力的類變量共享同一塊內(nèi)存區(qū)。
類方法也是類成員的一種,與類變量相似。
當(dāng)使用實(shí)例來訪問類成員時(shí),實(shí)際上依然是委托給該類來訪問類成員,因此,即使某個(gè)實(shí)例為null,它也可以訪問它所屬類的類成員。
當(dāng)然,如果一個(gè)null對(duì)象訪問實(shí)例成員,那可是會(huì)報(bào)NullPointerException異常的
類初始模塊也是類成員的一種,類初始化塊用于執(zhí)行類初始化動(dòng)作,在類的初始化階段,系統(tǒng)會(huì)調(diào)用該類的類初始化塊來對(duì)類進(jìn)行初始化。一旦該類初始化結(jié)束后,類初始化塊講永遠(yuǎn)不會(huì)獲得執(zhí)行的機(jī)會(huì)。
對(duì)于static而已,類成員不能訪問實(shí)例成員。因?yàn)轭惓蓡T是屬于類的,類成員的作用域比實(shí)例成員的作用域更大,完全可能出現(xiàn)類成員以及初始化完成,但實(shí)例成員還不曾初始化的情況,如果允許成員訪問實(shí)例成員將會(huì)引發(fā)大量錯(cuò)誤
所以,實(shí)際上Java和很多語言一樣,對(duì)象只能訪問實(shí)例變量,類變量通過類來訪問,只是它給使用者造成了一種假象