1. 程式人生 > >程式碼塊中的區域性變數與作用域

程式碼塊中的區域性變數與作用域

大多數過程型語言都有作用域(scope)的概念。作用域決定了在其內定義的變數名的可見性和生命週期。在C、C++和Java中,作用去由花括號的位置決定。例如:

{
    int x = 12;
    //only x available
    {
        int q = 36;
        //both x & q available
    }
    //only x available
    //q is "out of scope"
}

在定義域中定義的變數只可用於作用域結束之前。
考慮如下的一個問題:

public class CodeBlock {  
    public
static void main(String args[]) { { int x = 30; } int x = 100; System.out.println(x); } }

可以正常輸出,但是如果我們交換順序:

public class CodeBlock {  
    public static void main(String args[]) {    
        int x = 100;  
        {  
            int
x = 30; } System.out.println(x); } }

就會報錯。
實際上以上程式碼在C和C++中是合法的,但是在Java中卻不可以這樣寫,編譯器會報告變數x已經定義過。所以,在C和C++裡將一個較大的作用域的變數“隱藏”起來的做法,在Java中是不允許的。因為Java設計者認為這樣會導致程式混亂。
Java中:
第一種寫法:先定義了程式碼塊區域性變數後定義方法區域性變數,程式碼塊區域性變數x只能作用於定義它的程式碼塊,也就是說出了程式碼塊該x就被銷燬了,所以後來再定義一個方法區域性變數是可以的。
第二種寫法:先定義了方法區域性變數後定義了程式碼塊區域性變數,方法區域性變數的作用域是整個方法,出了該方法後這個方法區域性變數才被銷燬,此例中,在方法區域性變數還未被銷燬時就定義了相同名字的程式碼塊區域性變數,所以被視為重複定義。

物件的作用域:

{
    String s = new String("a string");
}//end of scope

引用s在作用域的終點就消失了,然而,s指向的String物件仍繼續佔據記憶體空間。Java神奇之處在於有一個垃圾回收器,用來監視new建立的所有物件,並辨別那些不會再被引用的物件。隨後,釋放這些物件的記憶體空間,以便提供其他物件使用。