控制代碼、引用、指標與物件
首先要分清是在什麼地方討論,在以前學C時,是這麼區分:
- 指標是物件在記憶體中的地址;
- 引用是物件的別名,其實質就是功能受限但是安全性更高的指標;
- 控制代碼是指標的指標,控制代碼實際上是一個數據,是一個Long (整長型)的資料。控制代碼是一個識別符號,是拿來標識物件或者專案的,它就象我們的姓名一樣。
Windows是一個以虛擬記憶體為基礎的作業系統。在這種系統環境下,Windows記憶體管理器經常在記憶體中來回移動物件,依此來滿足各種應用程式的記憶體需要。物件被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找該物件呢?為了解決這個問題,Windows作業系統為各應用程式騰出一些記憶體儲地址,用來專門登記各應用物件在記憶體中的地址變化,而這個地址(儲存單元的位置)本身是不變的。Windows記憶體管理器在移動物件在記憶體中的位置後,把物件新的地址告知這個控制代碼地址來儲存。
然後我們回到JAVA來解釋這個問題:
Java中有3個數據型別:基本資料型別、引用型別和null型別。其中,引用型別包括類型別(含陣列)、介面型別。為了區別引用型別的變數識別符號和基本資料型別變數識別符號,我們特別的(特意的)使用Handle來稱呼引用型別的變數識別符號。物件的引用是建立物件時的返回值!引用是new表示式的返回值。new A(); 這裡真正建立了一個物件,但我們沒有用控制代碼去持有(hold、拿著、儲存)該引用。handle是變數,reference是一種變數值。
A a = new A() ;
- 控制代碼a——常見為A a;或A a=new A();前者沒有被初始化,後者被手工初始化。(如果a是一個類的成員變數,會被預設初始化。)控制代碼不同於基本變數的關鍵,它是一種間接定址方式。控制代碼宣告常常稱為物件宣告(如果你感到可能引起混淆,不理睬物件宣告的說法好啦)。
- 建立物件——new A();這才是真正的建立物件。物件一般通過new表示式來建立。
- 計算new表示式的值:計算new表示式的值的整個過程,在微觀上完成了物件的建立和這個物件自己的成員變數的初始化,在巨集觀上得到new表示式的值,這個值稱為新物件的引用;
- 引用:new A()的值。引用可以簡單的看作物件佔據記憶體空間的地址;通過物件的引用,就可以方便的與其他物件區別開來,引用就是物件獨特的身份標識。
- 控制代碼的初始化:控制代碼 = 引用;即把引用賦值給控制代碼,如語句a=new A();完成控制代碼的初始化後,就可以用控制代碼遙控物件了。
- 對於語句A a=new A();是物件建立及物件初始化與控制代碼的初始化的合併。