本文主要介紹了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並沒有離開{}作用域,所以會語法錯誤。 上述的變數都是局部變量,那麼如果是在有全域變數的情況下又是怎樣一種結果呢?我們來用程式碼說話,程式碼如下: 大家仔細的觀察並結合程式碼思考,可以得到變數的作用域結論如下:在同一作用域範圍的包裹下全域
物件的作用域
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中文網其他相關文章!