From Gossip@caterpillar

Java Gossip: 變 數、常數

資料是儲存在記憶體中的一塊空間中,為了取得資料,您必須知道這塊記憶體空間的位置,然而若使用記憶體位址編號的話相當的不方便,所以使用一個明確的名稱 代表儲存在記憶體中的資料,變數(Variable)是一個指向資料儲存空間的參考,您將資料指定給變數,就是將資料儲存至對應的記憶體空間,呼叫變數, 就是呼叫對應的記憶體空間的資料供您使用。

在Java中要使用變數,必須先宣告變數名稱與資料型態,例如:
int intNum;         // 宣告一個整數變數
double dblNum;   // 宣告一個倍精度浮點數變數

就如上面所舉的例子,我們使用int、float、double、char等關鍵字 (Keyword)來宣告變數名稱並指定其資料型態,變數在命名時有一些規則,它不可以使用數字作為開頭,也不可以使用一些特殊字元,像是 *&^%之類的字元,而變數名稱不可以與Java 內定的關鍵字同名,例如int、float、class等等。

變數的命名有幾個風格,主要以清楚易懂為主,初學者為了方便,當使用一些簡單的字母來作為變數名稱,這會造成日後程式維護的困難,命名變數時發生同名的情 況也會增加。

在過去曾流行過匈牙利命名法,也就是在變數名稱前加上變數的資料型態名稱縮寫,例如intNum用來表示這個變數是int整數資料型態,fltNum表示 一個float資料型態,然而隨著現在程式的發展規模越來越大,這種命名方式已經不被鼓勵。

過去的程式在撰寫時,變數名稱的長度會有所限制,但現在已無這種困擾,因而現在比較鼓勵用清楚的名稱來表明變數作用,通常會以小寫字母作為開始,並在每個 單字開始時第一個字母使用大寫,例如:
int ageForStudent;
int ageForTeacher;

像這樣的名稱可以讓人一眼就看出這個變數的作用,這樣的命名方式,在Java程式設計領域中是最常看到的一種。

變數名稱可以使用底線作為開始,通常使用底線作為開始的變數名稱,表示它是私用的 (Private),只在程式的某個範圍使用,外界並不需要知道有這個變數的存在,通常這樣的變數名稱常用於物件導向程式設計中類別的私有成員(Private member),這樣的命名方式在Java中偶而也 會看到(比較常見於C++的程式撰寫中),一個宣告的例子如下:
double _window_center_x;
double _window_center_y;
 
當您在Java中宣告一個變數,就會配置一塊記憶體空間給它,這塊空間中原先可能就有資料,也因此變數在宣告後的值是不可預期的,Java對於安全性的要 求極高,您不可以宣告變數後,而在未指定任何值給它之前就使用它,編譯器在編譯時會回報這個錯誤,例如若宣告變數var卻沒有指定值給它,則會顯示以下訊 息:
variable var might not have been initialized

可以的話,儘量在變數宣告後初始其值,您可以使用「指定運算子」 (Assignment operator)=來指定變數的值,例如:
int ageForStudent = 0;
double scoreForStudent = 0.0;
char levelForStudent = 'A';

上面這段程式在宣告變數的時候,同時指定變數的儲存值,而您也看到如何指定字元給字元變數,字元在指定時需使用引號 ' ' 來包括;在指定浮點數時,會習慣使用小數的方式來指定,如0.0,在Java中寫下0.0這麼一個常數的話,其預設為double資料型態

在宣告變數之後,您可以直接呼叫變數名稱來取得其所儲存的值,下面這個程式是個簡單的示範:

  •  UseVariable.java
public class UseVariable { 
public static void main(String[] args) {
int ageForStudent = 5;
double scoreForStudent = 80.0;
char levelForStudent = 'B';

System.out.println("年級\t 得分\t 等級");
System.out.printf("%4d\t %4.1f\t %4c",
ageForStudent,
scoreForStudent,
levelForStudent);
}
}

執行結果:

 年級     得分    等級
       5       80.0          B


在Java中寫下一個數值,稱之為字面常量(Literal constant), 它會存在記憶體的某個位置,您無法改變它的值;而在使用變數的時候,也會使用一種叫「常數」的變數,嚴格來說它並不是常數,只不過指定數值給這個變數之 後,就不可再改變其值,有人為了區分其與常數的差別,還給了它一個奇怪的名稱:「常數變數」。

先不要管「常數變數」這個怪怪的名稱,其實它終究是個變數而已,只是在宣告變數名稱的同時,加上"final"來限定,只不過這個變數一但指定了值,就不可以再改變它的值,如 果程式中有其它程式碼試圖改變這個變數,編譯器會先檢查出這個錯誤,例如:
final int maxNum = 10;
maxNum = 20;

這一段程式碼中的maxNum變數使用final來限定,所以它在指定為10之後,就不可以再指定值給它,所以第二次指定會被編譯器指出錯誤:
cannot assign a value to final variable maxNum

使用final來限定的變數,目的通常就是不希望其它的程式碼來變動它的值,例如用於迴圈計數次數的指定(迴圈之後就會學到),或是像圓周率PI的指定。