1. 程式人生 > >IT兄弟連 Java語法教程 變數2

IT兄弟連 Java語法教程 變數2

變數的作用域和生命週期

到目前為止,使用的所有變數都是在main()方法開始時宣告的,然而,Java允許在任何程式碼塊(程式碼塊以開花括號開始,以閉花括號結束)中宣告變數,程式碼塊定義了作用域。因此,每當開始一個新的程式碼塊時就建立了一個新的作用域。作用域決定了變數(物件)對程式的其它部分的可見性,並且也決定了這些變數(物件)的生命週期。

許多其他的計算機語言定義了兩種通用的作用域類別,全域性作用域和區域性作用域。然而這些傳統的作用域不能很好地適應Java中嚴格的、面向物件的模型。雖然可以建立屬於全域性作用域的變數,但這只是例外,而不是規則。在Java中,兩種主要的作用域分別由類和方法定義的。儘管這種分類有些人為的因素,但是,由於類作用域具有的一些獨特屬性和特徵,不能應用於由方法定義的作用域,因此這種分類方法是有一定的道理的。由於存在這種差別,對類作用域的介紹已經超出了本書的內容範圍,所以本書將只分析由方法定義及在方法中定義的作用域。

由方法定義的作用域從方法的開花括號開始。然而,如果方法具有引數,那麼它們也會被包含到方法的作用域中。作為通用規則,在作用域中宣告的變數,對於在作用域之外定義的程式碼是不可見的(即不可使用)。因此,當在某個作用域中宣告變數時,就區域性化物件了該變數,並保護它免受未授權的使用或修改。實際上,作用域規則為封裝(將在學習面向階段時學習封裝,封裝是面向物件的三大特徵之一,面向物件的三大特徵分別是:封裝、繼承和多型)提供了基礎。

作用域是可以巢狀的。例如,每當建立一個程式碼塊時,就建立了一個新的、巢狀的作用域。當遇到這種情況時,外層的作用域包圍了內層的作用域。這意味著在外層作用域中宣告的變數對內層作用域中的程式碼是可見的。然而,反過來就不是這樣了,在內層作用域中宣告的變數,在內層作用域之外是不可見的。

在程式碼塊中,可以在任意位置宣告變數,但是隻有在宣告之後變數才是有效的。因此,如果在方法的開頭定義變數,那麼變數對於該方法的所有程式碼都是可見的,相反,如果在程式碼塊的末尾宣告變數,那麼變數是無用的,因為沒有程式碼能夠訪問該變數。

當進入變數的作用域時建立變數,當離開它們的作用域時銷燬變數。這意味著一旦離開作用域,變數就不會保持原來的值。所以,對於在方法中宣告的變數來說,在兩次呼叫該方法之間,變數不會保持它們的值。此外,對於在程式碼塊中宣告的變數來說,當離開程式碼塊時會丟失它們的值。因此,變數的生命週期被限制在作用域之內。

如果變數宣告中包含初始化,那麼每當進入宣告變數的程式碼塊時都會重新初始化變數。

 

變數的使用

使用變數的方式有很多,使用System.out.println()在控制檯輸出變數值是使用變數的一種方式,也可以使用運算子完成變數之間的運算。新建Java原始碼檔案Example01.java,編寫如下程式碼:

public class Example01{

    /**

     * main方法,程式執行的入口

     */

    public static void main(String[] args){

         int price = 10;

         int count = 5;

         System.out.println("商品總價:" + price * count);

    }

}

上面的案例在運算中,使用“*”完成了變數之間乘法運算,使用“+”完成了字串與數字的拼接,最終輸入結果如圖2所示:

82e2f1bf588348b3a2e462ebff5b5314.png

圖2  Example01執行結果

 

需要注意的是僅僅宣告但沒有初始化的變數是不允許使用的,例如以下程式碼:

public class Example01{

    /**

     * main方法,程式執行的入口

     */

    public static void main(String[] args){

         int price = 10;

         int count = 5;

         System.out.println("商品總價:" + price * count);

         int num;               //宣告一個變數但是沒有進行初始化

         System.out.println(num);        //使用一個未初始化的變數,在編譯階段將                                     //提示錯誤資訊

    }

}

編譯以上程式碼,控制檯將提示如圖3所示的錯誤。

9c8e800534394528bac2322192387d29.png