首頁 >Java >java教程 >Java變數與物件的作用域詳解(圖文)

Java變數與物件的作用域詳解(圖文)

黄舟
黄舟原創
2017-03-29 11:01:482419瀏覽

本文主要介紹了Java變數和物件的作用域的相關知識。具有很好的參考價值,以下跟著小編一起來看下吧

大多數程式設計語言都提供了「作用域」(Scope)的概念。

對於在作用域裡定義的名字,作用域同時決定了它的「可見性」以及「存在時間」。在C,C++和Java裡,作用域是由花括號的位置決定的。

變數的作用域

範例:

{
  int x = 12;
  /* only x available */
  {
    int q = 96;
    /* both x & q available */
  }
  /* only x available */
  /* q “out of scope” */
}

Java以一對大括號作為語句區塊的範圍,稱為作用域,作為在作用域裡定義的一個變量,它只有在哪個作用域結束之前才可使用。

在Java中不能像下面這樣書寫程式碼:

 {
   int x = 12;
   {
     int x = 96; /* illegal */
   }
 }

Java編譯器會認為變數已被定義,所以作用域中的變數不能重複定義,但是在C和C++中能將一個變數「隱藏」在一個更大的作用域裡,在C和C++中被允許,在Java中是不允許的,因為Java的設計者認為這樣做使程式產生了混淆。

再來看兩個例子,為了讓大家看到效果這裡使用截圖的方式:

##②

我們再來看這段程式碼,大家思考一個問題,第11行和第12

行為什麼沒有語法錯誤?程式碼如下:

如果我們交換位置呢,程式碼如下:

離開作用域,變數所分配的記憶體空間會被JVM回收,所以語法不會有錯誤,而第二種寫法name並沒有離開{}作用域,所以會語法錯誤。

上述的變數都是局部變量,那麼如果是在有全域變數的情況下又是怎樣一種結果呢?我們來用程式碼說話,程式碼如下:

大家仔細的觀察並結合程式碼思考,可以得到變數的作用域結論如下:

在同一作用域範圍的包裹下全域

變數名稱和局部變數名稱是可以變數名稱相同的,在同一個作用域範圍的包裹下局部變數和局部變數不可以變數名稱相同(作用域內不能重複命名),使用變數的時候如果不指明使用全域變數還是局部變量,那麼預設的就是使用局部的那個變量,但是如果局部變數超出了它本身的作用域範圍則會失效,被JVM垃圾回收,那麼則可以重複命名此變量,並使用最新定義的這個局部變數。

物件的作用域

Java物件不具備與朱類型一樣的存在時間。用

new關鍵字建立一個Java物件的時候,它會超出作用域的範圍之外。所以假若使用下面這段程式碼:

 {
   String s = new String("a string");
 } /* 作用域的终点 */

那麼句柄s,也就是

引用會在作用域的終點消失。然而,s指向的String物件依然佔據著記憶體空間。在上面這段程式碼裡,我們沒有辦法繼續使用這個對象,因為指向它的唯一一個句柄已經超出了作用域的邊界。

這樣造成的結果是:對於用new創建的對象,只要我們願意,它們就會一直保留下去。這個

程式問題在C和C++裡特別突出。在C++裡遇到的麻煩最大:由於無法從語言獲得任何幫助,所以在需要物件的時候,根本無法確定它們是否可用。而且最麻煩的是,在C++裡,一旦完成工作,就必須確保將物件手動清除。

這樣便帶來了一個有趣的問題。假如 Java 讓物件依然故我,怎樣才能防止它們大量充斥內存,並最終造成程式的「凝固」。在 C++裡,這個問題最令程式設計師頭痛。但 Java 以後,情況卻發生了改觀。 Java 有一個特別的“垃圾收集器”,它會尋找用 new 創建的所有對象,並辨別其中哪些不再被引用。隨後,它會自動釋放那些閒置物件佔據的內存,以便能由新物件使用。這意味著我們根本不必操心記憶體的回收問題。只需簡單地建立物件,一旦不再需要它們,它們就會自動離開。這樣做可防止在 C++裡很常見的一個程式設計問題:由於程式設計師忘記釋放記憶體造成的「記憶體溢位」。

以上是Java變數與物件的作用域詳解(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn