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變數
- Java 變數種類Java變數
- 匿名內部類訪問final區域性變數變數
- C/C++—— 除了用類成員函式訪問類私有成員變數外,還可以通過類物件地址來直接訪問和修改類的私有成員變數C++函式變數物件
- Java-物件及變數的併發訪問小結Java物件變數
- C:static 關鍵字、靜態變數、跨類訪問資料變數
- js中變數和jsp中java程式碼中變數互相訪問解決方案JS變數Java
- go 突破訪問限制,訪問其他包中的私有變數Go變數
- JNI/NDK開發指南(7):C/C++訪問Java例項變數和靜態變數C++Java變數
- java RandomAccessFile類(隨機訪問檔案)JavarandomMac隨機
- Java內部類的訪問規則Java
- smarty中三種變數的訪問方式變數
- Java 的可變引數與 Collections 類Java
- Java多執行緒/併發12、多執行緒訪問static變數Java執行緒變數
- java中使用URLClassLoader訪問外部jar包的java類JavaJAR
- Java 8 徹底改變資料庫訪問Java資料庫
- Java繼承中成員變數的訪問特點「圖文分析」包含繼承中重名訪問的特點Java繼承變數
- rust程式中設定和訪問環境變數Rust變數
- java類成員中的訪問級別有哪些Java
- [java IO流]之 隨機訪問檔案(RandomAccessFile類)Java隨機randomMac
- Block內部訪問例項變數會出現的問題BloC變數
- Java類的設計和封裝及類成員的訪問控制Java封裝
- 【Java小疑問】java變數儲存的位置(雜)Java變數
- OC開發例項變數的訪問控制詳解變數
- java執行緒安全問題之靜態變數、例項變數、區域性變數Java執行緒變數
- java變數Java變數
- Java技巧-解決JAVA_HOME變數無效問題Java變數
- 十四、類變數和實列變數(python)變數Python
- 變數的分類(臨時(本地)變數、環境變數、全域性變數和系統變數)變數
- JNI訪問Java方法Java
- TypeScript 類訪問修飾符TypeScript
- 淺談Java類中的變數初始化順序Java變數
- java環境變數配置好了,就是無法載入主類Java變數
- Variables in Java 變數Java變數
- java 變數(轉)Java變數