在程序中, 我們經常會 方法名(new 類名().方法()); 這樣 new 類名() 出來的其實也是一個 對象,
但是和 類名 對象名 = new 類名() 這樣的創建出來的對象就是不一樣啊?
哪裏不一樣呢? new 類名() 創建出來的是一個 匿名對象, 他沒有被棧內存中的任何名稱所指向,
這種匿名對象只能夠使用一次的.
這種匿名對象 我們通常就是在 將一個對象作爲實參傳入一個方法中去. 他通常只是在堆內存中開闢了一片空間, 而且這種對象通常就是作爲方法的參數而出現的.
String 是一個類 我們使用的時候有兩種方式, (1) .String object1 = new String("zero");
(2) String str1 = "zero";
第一種方式呢: 是首先在堆內存中開闢了一片區域 將"zero" 這個字符串存入進去, 並同時被棧內存中的 object1 (句柄) 所指向, 然後因爲 new String() 的關係 就又在堆內存中開闢了一片區域,放置這個對象,這樣的話其中就有一個事垃圾空間了.
String str1 = "zero"; 則是隻在堆內存中開闢了一片空間, 存儲了 "zero" 這個字符串而已, 然後被str1所指向.
String 與 匿名對象
"zero".equals(對象名) 這裏就可以看出來, "zero" 這樣的一個字符串就是一個匿名對象了.
看這麼一段, 輸出的結果就是 true , 這說明什麼呢?
說明 name1 和 name2 的內存地址是一樣的. 這是爲什麼呢?
這裏就是說到了 java的共享設計模式 . 在java中 , 當一個 賦值和 前面剛剛覆過的值 是一樣的, 就不會在創建一個再在 堆內存中創建一個空間, 而是直接指向了那個已有的字符串的堆內存空間.
String 中的內容一旦聲明就不能改變 . 這句話是怎麼體現的呢?
這樣的話 就看的很清了, 當 String name1= "123" 的時候, 就是在棧內存中聲明瞭一個空間 name1 ,然後在堆內存中 存在一片空間,值爲 123 , 被 name1 所指向.
fun(name1)的時候, 就是把name1 的指向同時也給了str2 , str2 也指向了堆內存中的"123", 然後在fun() 中, str2 被賦予了 "space" , 這在內存中就表現爲, 又在堆內存中增加了一個字符串 "space" , 因爲"space"是要賦給str2 的 ,但是str2 原來又是指向 "123"的, 這時 就把str2到 "123"的指向破壞了,
轉而指向了 "space" .
System.out.println(name1) 輸出顯示的name1 的值,在內存空間中, name1 還是指向的 "123" , 自始至終都沒有變過 , 輸出顯示的肯定就還是 123 了