Java訪問類變數

山有木xi發表於2020-02-23

很多語言都不允許透過物件訪問類變數,物件只能訪問例項變數,為什麼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物件呼叫所屬類的靜態方法,沒有報錯,還可以正常輸出

這其中就涉及到了Java的類,類成員和static

類成員包括類變數,類方法等

讓我們來看看類變數的定義:

“類變數屬於整個整個類,當系統第一次準備使用該類時,系統會為該類變數分配記憶體空間,類變數開始生效,直到該類被解除安裝,該類的類變數所佔用的記憶體才被系統的垃圾回收機制回首。類變數生存範圍幾乎等同於該類的生存範圍。當類初始化完成後,類變數也初始化完成”

當我們看一下上面程式碼的分配記憶體情況可知

當系統建立該類的物件時,系統不會再為類變數分配記憶體,也不會再次對壘變數進行初始化,也就是說,物件根本不擁有對應類的類變數。透過物件訪問類變數只是一種假象。當透過物件來訪問類變數時,系統會在底層轉換為該類來訪問類變數。

由於物件實際上並不持有類變數,類變數時由該類持有的,同一個類的所有物件訪問類變數時,實際上訪問的都是該類的類變數。從程式執行表面來看,即可看到同一類的所有勢力的類變數共享同一塊記憶體區。

類方法也是類成員的一種,與類變數相似。

當使用例項來訪問類成員時,實際上依然是委託給該類來訪問類成員,因此,即使某個例項為null,它也可以訪問它所屬類的類成員。

當然,如果一個null物件訪問例項成員,那可是會報NullPointerException異常的

類初始模組也是類成員的一種,類初始化塊用於執行類初始化動作,在類的初始化階段,系統會呼叫該類的類初始化塊來對類進行初始化。一旦該類初始化結束後,類初始化塊講永遠不會獲得執行的機會。

對於static而已,類成員不能訪問例項成員。因為類成員是屬於類的,類成員的作用域比例項成員的作用域更大,完全可能出現類成員以及初始化完成,但例項成員還不曾初始化的情況,如果允許成員訪問例項成員將會引發大量錯誤

所以,實際上Java和很多語言一樣,物件只能訪問例項變數,類變數透過類來訪問,只是它給使用者造成了一種假象

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2676877/,如需轉載,請註明出處,否則將追究法律責任。

相關文章