新聞中心
很多語言都不允許通過對象訪問類變量,對象只能訪問實例變量,為什么Java可以?
public class NullAS{ private static void a(){ System.out.println("hello word"); } public static void main(String[] args) { NullAS N = null; N.a(); } }
這段代碼最終的輸出結果是:
hello Word
有些人可能會有疑問,使用null對象調用所屬類的靜態(tài)方法,沒有報錯,還可以正常輸出
這其中就涉及到了Java的類,類成員和static
類成員包括類變量,類方法等
讓我們來看看類變量的定義:
“類變量屬于整個整個類,當系統(tǒng)第一次準備使用該類時,系統(tǒng)會為該類變量分配內存空間,類變量開始生效,直到該類被卸載,該類的類變量所占用的內存才被系統(tǒng)的垃圾回收機制回首。類變量生存范圍幾乎等同于該類的生存范圍。當類初始化完成后,類變量也初始化完成”
當我們看一下上面代碼的分配內存情況可知
當系統(tǒng)創(chuàng)建該類的對象時,系統(tǒng)不會再為類變量分配內存,也不會再次對壘變量進行初始化,也就是說,對象根本不擁有對應類的類變量。通過對象訪問類變量只是一種假象。當通過對象來訪問類變量時,系統(tǒng)會在底層轉換為該類來訪問類變量。
由于對象實際上并不持有類變量,類變量時由該類持有的,同一個類的所有對象訪問類變量時,實際上訪問的都是該類的類變量。從程序運行表面來看,即可看到同一類的所有勢力的類變量共享同一塊內存區(qū)。
類方法也是類成員的一種,與類變量相似。
當使用實例來訪問類成員時,實際上依然是委托給該類來訪問類成員,因此,即使某個實例為null,它也可以訪問它所屬類的類成員。
當然,如果一個null對象訪問實例成員,那可是會報NullPointerException異常的
類初始模塊也是類成員的一種,類初始化塊用于執(zhí)行類初始化動作,在類的初始化階段,系統(tǒng)會調用該類的類初始化塊來對類進行初始化。一旦該類初始化結束后,類初始化塊講永遠不會獲得執(zhí)行的機會。
對于static而已,類成員不能訪問實例成員。因為類成員是屬于類的,類成員的作用域比實例成員的作用域更大,完全可能出現(xiàn)類成員以及初始化完成,但實例成員還不曾初始化的情況,如果允許成員訪問實例成員將會引發(fā)大量錯誤
所以,實際上Java和很多語言一樣,對象只能訪問實例變量,類變量通過類來訪問,只是它給使用者造成了一種假象
網(wǎng)頁名稱:Java訪問類變量-創(chuàng)新互聯(lián)
瀏覽地址:http://www.ef60e0e.cn/article/copjsj.html