面向對象程序設計(三)

      在程序中, 我們經常會  方法名(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 了

      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章