在java中一切都被視為對象,操作對象實際上的操作對象的一個「引用」。兩者之間的關係就等於用遙控器(引用)來操作電視機(物件)。擁有一個引用,不一定需要有一個物件與它關聯,例如Sting a;只是聲明了一個引用並沒有關聯到一個物件。
一但創建了一個引用,就希望與一個物件相關聯,通常用new來新建一個物件(java中字串可以用帶引號的文字初始化)。
(1)暫存器。最快的儲存區(位於處理器內部),java中無法人為直接控制(c++/c中允許向編譯器建議暫存器分配方式)。
(2)堆疊。位於RAM中,堆疊指標向下移動分配新的內存,向上移動釋放內存,速度很快,僅次於寄存器。但是創建系統時java系統必須知道儲存在堆疊內所有項目的確切宣告週期,以便於上下移動指標。這項約束限制了程式的靈活性,一些基本類型的變數和物件的參考(java物件並不在其中)被存放在堆疊中。
(3)堆。一種通用記憶體池(位於RAM中),用於存放所有的java物件。堆不同於棧的好處是:編譯器不需要知道儲存的資料在堆中存活多長事件。當new一個物件時會自動在堆中分配記憶體進行儲存。在不需要該物件時由編譯器自動回收無需人為控制。當然,這種靈活性是需要付出代價的:比起c/c++在堆疊中建立物件需要更多的時間。
(4)常數儲存。常量值通常直接存放在程式碼內部,因為常數值永遠不會改變。
(5)非RAM儲存。數據存活於程序之外,可以不受程序的任何控制。例如流對象和持久化對象。
程式設計中常用到的一系列類型,例如整數,小數,字元......這些類型被稱為基本類型,被特殊對待。
為什麼要特殊對待? new是將物件儲存在堆中,之前說到存在堆中的數據需要的時間更長,所以對於這些經常用到的,特別小的,簡單的數據,如果存在堆中代價太大。因此java不用new來創建變量,而是創建一個並非是引用的「自動」變量。這個變數直接存值並置於堆疊中。基本型別所佔儲存空間大小是固定的。
為了適應萬物皆對象,基本類型都有一個包裝器類,使得可以在堆中創建一個非基本對像用來表示對應的基本類型。
例如:
char c='a'; Character ch=new Character(c); 或者 Character ch=new Character('a');
java se5中的自動包裝功能是的兩者之間可以自動轉換。
變數作用域:變數包含直接存值的基本型別和類別的參考。只在程式碼段內存活。
物件作用域:
{ String s=new String("string"); }//end of scope
引用s存在堆疊上,在作用域終點生命終結。然而s指向的String物件繼續存活在堆中。由java的垃圾回收器來判斷何時回收該物件。這樣做消除了大部分「記憶體外洩」的問題。
java和c/c++不同,對於java的方法參數到底是傳值還是傳引用很多人搞不清楚。對於基本資料型別傳遞的是值,因為基本資料是直接存值在堆疊區。物件傳遞的是引用(棧區的物件引用即堆區物件的位址)。以String和StringBuilder來說明。
下面看兩個例子。
public class Test {public static void test(String str) { str = "world"+str; }public static void main(String[] args) { String str1 = new String("hello"); test(str1); System.out.println(str1); } }
上面範例的輸出結果還是hello,為什麼呢?因為test中對str的修改並不是原來物件上的修改,這裡就牽涉到了String物件的特點,String物件建立後無法修改,上面的修改其實是:新建一個空的StringBuilder然後呼叫append方法插入“world”,str,然後呼叫toString方法新建一個新的String物件。所以此時str的參考物件已經是全新的了,所以主函數中str1並未改變。下面再看個StringBuilder的例子。
public class test1 { static void test(StringBuilder str){ str.append("1234"); } public static void main(String[] args) { StringBuilder a=new StringBuilder("abc"); test(a); System.out.println(a.toString()); } }
上面輸出結果abc1234,test中對str的修改同時也對a生效,因為str和a的引用都是指向同一個StringBuilder對象,而StringBuilder是可修改的。這裡足以說明傳遞的是引用。
以上是Java一切都是物件的詳細內容。更多資訊請關注PHP中文網其他相關文章!