分析一下JAVA中對象創建和初始化過程中涉及的相關概念問題,java中棧(stack)與堆(heap),對象、引用、句柄的概念。
@Author:ZJ 06-11-25
Blog: http://zhangjunhd.blog.51cto.com/
1.Java中的數據類型
Java中有3個數據類型:基本數據類型(在Java中,boolean、byte、short、int、long、char、float、double這八種是基本數據類型)、引用類型和null類型。其中,引用類型包括類類型(含數組)、接口類型。
下列語句聲明了一些變量:
以下是引用片段: int k ; A a; //a是A數據類型的對象變量名。 B b1,b2,…,b10000;// 假定B是抽象類或接口。 String s; |
注意:從數據類型與變量的角度看,基本數據類型變量k、類類型變量a和s、抽象類或接口類型變量b(1萬個),它們都是變量(標識符)。
2.關于句柄(handle)
為了區別引用類型的變量標識符和基本數據類型變量標識符,我們特別的使用Handle來稱呼引用類型的變量標識符。上面例子中b1至b10000、a、s都是Handle。Handle直觀的看就是手柄、把手,我們采用計算機界常用的中文翻譯“句柄”。
句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。
從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之后其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。
如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內存地址。應用程序啟動后,組成這個程序的各對象是駐留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那么就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那么您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪里去找該對象呢?
為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置后,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。
句柄地址(穩定)→記載著對象在內存中的地址────→對象在內存中的地址(不穩定)→實際對象
2.2Java中句柄的意義
對句柄以前的【Windows編程中的】含義有了深刻的認識,我們可以說Handle是一個我們學習Java時非常需要的術語。它的意義在于區別“對象本身”和對象變量(或者嚴格點:對象所屬的數據類型的變量標識符)。
2.3回到1中的變量聲明:
現在,你應該對下面的注釋一目了然。
int k, j ;//k里面存放的是一個整型數。
A a; //a里面存放地址。
B b1,b2,…,b10000;// b1,…,b10000里面存放地址。
String s; //s里面存放地址。
原文轉自:http://www.anti-gravitydesign.com