Java訪問類變數
很多語言都不允許透過物件訪問類變數,物件只能訪問例項變數,為什麼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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- java類變數Java變數
- Java 變數種類Java變數
- C#訪問或修改私有類、函式、變數、屬性C#函式變數
- Java-物件及變數的併發訪問小結Java物件變數
- Java - 24 類變數和類方法Java變數
- C:static 關鍵字、靜態變數、跨類訪問資料變數
- go 突破訪問限制,訪問其他包中的私有變數Go變數
- Python如何訪問閉包中的變數Python變數
- Java 的可變引數與 Collections 類Java
- Java繼承中成員變數的訪問特點「圖文分析」包含繼承中重名訪問的特點Java繼承變數
- 類的訪問控制
- java類成員中的訪問級別有哪些Java
- [java IO流]之 隨機訪問檔案(RandomAccessFile類)Java隨機randomMac
- rust程式中設定和訪問環境變數Rust變數
- Java類的設計和封裝及類成員的訪問控制Java封裝
- Java中的類(好似結構體) 物件(好似指標變數)變數 方法Java結構體物件指標變數
- 【Java小疑問】java變數儲存的位置(雜)Java變數
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- java變數Java變數
- 不同包類的互相訪問
- TypeScript 類訪問修飾符TypeScript
- Java技巧-解決JAVA_HOME變數無效問題Java變數
- 十四、類變數和實列變數(python)變數Python
- 深入理解java:執行緒本地變數 java.lang.ThreadLocal類Java執行緒變數thread
- hbase - [04] java訪問hbaseJava
- 既然Java反射可以訪問和修改私有成員變數,那封裝成private還有意義麼?Java反射變數封裝
- java環境變數配置好了,就是無法載入主類Java變數
- 淺談Java類中的變數初始化順序Java變數
- 在其他程式集訪問internal類
- 07@在物件內部儘量直接訪問例項變數物件變數
- 博圖中Dword、Dint、Real型別變數高低字的訪問型別變數
- Python3通過字串訪問與修改區域性變數Python字串變數
- 變數的分類(臨時(本地)變數、環境變數、全域性變數和系統變數)變數
- 使用 session 訪問計數Session
- 透過更改java環境變數修改java版本不生效問題Java變數
- 成員變數、全域性變數、例項變數、類變數、靜態變數和區域性變數的區別變數
- Java的訪問修飾符Java