變數


如果想使用基本型態資料,只要在程式中寫下10、3.14這類的數值即可。例如:

System.out.println(10);
System.out.println(3.14);
System.out.println(10);

想像一下程式中輸出10的部份很多,如果想要一次把它改為20,那也要改很多地方,如果要求JVM有個位置可以暫存10這個值,每次都取出這個暫存位置的值來輸出,如果將暫存位置的值改為20,那所有輸出不就都改為20了嗎?對!這個暫存位置在程式語言中稱之為變數(Variable),你可以宣告(Declare)變數,也就是告訴JVM,我要有個位置,這個位置叫作xxx名稱,可以放什麼型態的資料。例如:

int number = 10;
double PI = 3.14;
System.out.println(number);
System.out.println(PI);
System.out.println(number);

這個程式片段的第一行在告訴JVM,我要有個位置,這個位置叫作number名稱,可以放int型態的資料,=表示指定number名稱的位置會存放10,用程式術語來說的話,你宣告了number變數,型態為int,使用=指定運算子指定number變數的值為10。


如果之後所有輸出10的部份改為20,那就只要修改number變數的指定值為20就可以了,這就是程式語言中變數的作用:用來暫存資料。


基本規則

對基本型態來說,想要宣告何種型態的變數,就使用byte、short、int、long、float、double、char、boolean等關鍵字來宣告,變數在命名時有一些規則,它不可以使用數字作為開頭,也不可以使用一些特殊字元,像是*、&、^、%之類的字元,而變數名稱不可以與Java 的關鍵字(Keyword)同名,例如int、float、class等就不能用來作為變數,變數名稱也不可以與Java保留字(Reversed word)同名,例如goto就不能用來作為變數名稱。

變數命名的風格主要以清楚易懂為主。初學者為了方便,常使用一些簡單字母來作為變數名稱,這會造成日後程式維護的困難,命名變數時發生同名的情況也會增加。在Java領域中的命名慣例(Naming convention),通常會以小寫字母開始,並在每個單字開始時第一個字母使用大寫。例如:

int ageOfStudent;
int ageOfTeacher;

這種命名方式有個有趣的名稱,稱為駝峰式(Camel case)命名法,可讓人一眼就看出這個變數的作用。

目前為止,我們的程式範例都是撰寫在main()方法(Method)中,在方法中宣告的變數稱為區域變數(Local variable)。在Java中宣告一個區域變數,就會為變數配置一塊記憶體空間,但不會給這塊空間預設值,這塊空間中原先可能就有無法預期的值,Java對於安全性的要求極高,不可以宣告區域變數後未指定任何值給它之前就使用變數,編譯器遇到這種情況也會編譯錯誤。例如底下程式碼:

double score;
System.out.println(score);

這個程式片段宣告變數score卻沒有指定值給它,第二行馬上就要顯示值,就會產生以下編譯錯誤:

error: variable score might not have been initialized
        System.out.println(score);
                           ^

如果在指定變數值之後,就不想再改變變數值,可以在宣告變數時加上final限定,如果後續撰寫程式時,自己或別人不經意想修改final變數,就會出現編譯錯誤。例如這段程式碼:

final double PI = 3.141596;
PI = 3.14;