您好,登錄后才能下訂單哦!
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對象調用所屬類的靜態方法,沒有報錯,還可以正常輸出
這其中就涉及到了Java的類,類成員和static
類成員包括類變量,類方法等
讓我們來看看類變量的定義:
“類變量屬于整個整個類,當系統第一次準備使用該類時,系統會為該類變量分配內存空間,類變量開始生效,直到該類被卸載,該類的類變量所占用的內存才被系統的垃圾回收機制回首。類變量生存范圍幾乎等同于該類的生存范圍。當類初始化完成后,類變量也初始化完成”
當我們看一下上面代碼的分配內存情況可知
當系統創建該類的對象時,系統不會再為類變量分配內存,也不會再次對壘變量進行初始化,也就是說,對象根本不擁有對應類的類變量。通過對象訪問類變量只是一種假象。當通過對象來訪問類變量時,系統會在底層轉換為該類來訪問類變量。
由于對象實際上并不持有類變量,類變量時由該類持有的,同一個類的所有對象訪問類變量時,實際上訪問的都是該類的類變量。從程序運行表面來看,即可看到同一類的所有勢力的類變量共享同一塊內存區。
類方法也是類成員的一種,與類變量相似。
當使用實例來訪問類成員時,實際上依然是委托給該類來訪問類成員,因此,即使某個實例為null,它也可以訪問它所屬類的類成員。
當然,如果一個null對象訪問實例成員,那可是會報NullPointerException異常的
類初始模塊也是類成員的一種,類初始化塊用于執行類初始化動作,在類的初始化階段,系統會調用該類的類初始化塊來對類進行初始化。一旦該類初始化結束后,類初始化塊講永遠不會獲得執行的機會。
對于static而已,類成員不能訪問實例成員。因為類成員是屬于類的,類成員的作用域比實例成員的作用域更大,完全可能出現類成員以及初始化完成,但實例成員還不曾初始化的情況,如果允許成員訪問實例成員將會引發大量錯誤
所以,實際上Java和很多語言一樣,對象只能訪問實例變量,類變量通過類來訪問,只是它給使用者造成了一種假象
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。