J5. 變量與常量
1.1 變量與常量
在程序執行過程中,其值不能被改變的量稱為常量,其值能被改變的量稱為變量。變量與常量的命名都必須使用合法的標識符。
1.1.1 常量
在程序運行過程中一直不會改變的量稱為常量(constant),通常也被稱為“final變量”。常量在整個程序中只能被賦值一次。在為所有的對象共享值時,常量是非常有用的。常量是不能改變的值。常量通常會被修飾為final static,final意味著這是不能修改的值,static是靜態,被static修飾的值可以直接通過類名調用,減少了在內存空間分配內存,減輕了內存空間的壓力。常量可以是基本數據類型,也可以是引用類型,如我們常見的單例。
1.1.1.1 常量的聲明以及註意事項
在Java語言中聲明一個常量,除了要指定數據類型外,還需要通過final關鍵字進行限定。聲明常量的標準語法如下:
final 數據類型 常量名稱[=值]
常量名通常使用大寫字母,但這不是必須的。很多Java程序員使用大寫字母表示常量,是為了清楚地表明正在使用的常量。
當定義的final變量屬於“成員變量”時,必須在定義時就設定他的初值,否則將會產生編譯錯誤。當常量要被靜態方法引用時,那麽必須將常量靜態化或者通過實例調用。
註意:在靜態方法中不能調用非靜態的方法和引用非靜態的成員變量?如何理解?
答:有static修飾的方法或變量,在程序運行時先初始化靜態的方法和變量。在這之前非靜態的還未初始故不能調用。若需調用要先靜態化。
1.1.1.2 常量的分類
Java中常量主要分為兩大類:字面值常量和自定義常量
字面值常量又下面幾種:
- 整數常量:所有整數,無窮多,正整數、負整數,例如:1、2、0等;對於整數有四種表現形式
- 小數常量:包含所有小數,也叫浮點數,例如:1.2、2.0、等;
- 布爾型常量:較為特殊的常量只包含兩個數值(true\false);
- 字符常量:將一個字符或符號用‘ ’標識;
- 字符串常量:將一個或多個字符用“ ”標識;
- Null常量:只有一個數值就是null;
【例4.13】創建一個類ConstantPractice,被對其進行一些驗證;
class ConstantPractice{
static final double dou = 23.23; //定義的final變量屬於“成員變量”時,必須在定義時就設定他的初值,當它會在靜態方法中被引用時,那麽必須讓它成為靜態常量,否則將會產生編譯錯誤"無法從靜態上下文中引用非靜態"
final boolean boo = true ;
public static void main(String[] args){
final int a ;
int s = 34 ;
a = 23 ;
// a = 23 ; //當我們已經聲明一個常量並對其賦值,那麽再次賦值會出現錯誤"可能已分配變量"
System.out.println(a);
System.out.println(dou);
}
}
註意:常量和變量有一點不同,變量可以在運行時賦值,所以成員字段可以未經初始化就被使用,但是常量不能在運行時改變,所以常量應該在聲明時就初始化,否則編譯不通過。
1.1.2 變量
1.1.2.1 變量的原理和聲明
變量的使用是程序設計中一個十分重要的環節。定義變量就是要告訴編譯器(compiler)這個變量的數據類型,這樣編譯器才知道需要配置多少空間給它,以及它能存放什麽樣的數據。在程序運行時空間內的值是變化的,這個內存空間就稱為變量。為了便於操作給這個空間取個名字,稱為變量名。變量的命名必須是合法的標識符。內存空間內的值就是變量值。在聲明變量時可以是沒有賦值,也可以是直接賦給初值。
從本質上講,變量其實是內存中的一小塊區域,使用變量名來訪問這塊區域,因此,每一個變量使用前必須要先申請(聲明),然後必須進行賦值(填充內容),才能使用
簡單來說我麽可以將其總結為下面這幾點:
變量的概念 |
² 內存中的一個存儲區域 ² 該區域有自己的名稱(變量名)和類型(數據類型) ² 該區域的數據可以在同一類型範圍內不斷變化 |
為什麽要定義變量 |
² 用來不斷的存放同一類型的常量,並可以重復使用 |
使用變量註意 |
² 變量的作用範圍(一對{}之間有效) ² 初始化值(成員變量不賦值是有默認值的) |
變量的聲明(註:格式是固定的,記住格式,以不變應萬變。) |
數據類型 變量名 = 初始化值;
|
|
理解:變量就如同數學中的未知數。 |
【例4.14】創建一個VariablePractice類,並進行一些操作,進而分析。
class VariablePractice{
static int age ; //當變量要被靜態方法引用時,變量要靜態化
static char char1 = ‘r‘ ;
public static void main(String[] args){
age = 78 ;
int 年齡 = 26 ;
System.out.println("大齡青年你的年齡是: "+年齡);
System.out.println(age);
System.out.println(char1);
}
}
假設上面兩個變量定義在方法體中,則程序加載到程序區中。當執行此行程序代碼時,會在數據區配置空間給出這兩個變量。
1.1.2.2 變量的命名
變量雖然是由程序與所命名的,但是變量的命名卻不是任意的,需要遵循一定的規則。Java中變量的命名規則如下:
- l 變量名必須是一個有效的標識符。變量名必須使用Java語言中合法的標識符,即以字母、數字和下劃線組成,且首字母不能是數字,還不可以使用關鍵字。
- l 變量名不能重復。如果存在兩個相同的變量名,那麽程序在運行時就不知道調用哪個變量了。
- l 變量名稱應該見名知意。命名最好能夠通過變量名知道變量的內容,增加可讀性;方便維護。
在Java語言中允許使用漢字或其他語言文字作為變量名,如“int 年齡 = 21”,在程序運行時並不會出錯,但還是建議不要這麽命名。
變量名實際上只是一個指針指向內存中變量的那塊內存區域。
1.1.2.3 變量的有效範圍---成員變量、局部變量
由於變量被定義出來後只能被暫放到內存中,等到程序執行到某一個點,該變量會被釋放掉,也就是說變量有它的生命周期。因此,變量的有效範圍是指程序代碼能夠訪問該變量的區域,若超出該區域則在編譯時出現錯誤。在程序中一般根據變量的“有效範圍”將變量分為“成員變量”和“局部變量”。
成員變量
在類體中被定義的變量稱為成員變量,成員變量在整個類中都有效。類的成員變量又可分為兩種,即靜態變量和實例變量。下面我們通過一段代碼來了解一下。
【例4.15】聲明靜態變量和實例變量,示例代碼如下:
class var{
int x = 45 ;
static int y = 90 ;
}
其中,x為實例變量,y為靜態變量(也稱類變量)。如果在成員變量的類型前面加上關鍵字static,這樣的成員變量稱為靜態變量。靜態變量的有效範圍可以跨類,甚至可以達到整個應用程序之內。對於靜態變量,除了能在定義它的類中存取,還能直接以“類名.靜態變量”的方式在其他類中使用。
局部變量
在類的方法體中定義的變量(方法內部定義,“{”與“}”之間的代碼中聲明的變量)稱為局部變量。局部變量只在當前代碼塊中有效。通俗的理解就是在其所在的一對大括號中有效,出了這個大括號就沒有效了,在其它類體中不能調用該變量。
在類的方法中聲明的變量,包括方法的參數,都屬於局部變量。局部變量只在當前定義的方法內有效,不能用於類的其他方法中。局部變量的生命周期取決於方法,當方法被調用時,Java虛擬機為方法中的局部變量分配內存空間,當該方法的調用結束後,則會釋放方法中局部變量占用的內存空間,局部變量也將會銷毀。
局部變量可與成員變量的名字相同,此時成員變量將被隱藏,即這個成員變量在此方法中暫時失效。舉例證明如下:
【例4.16】在VariablePractice類中我們進行如下測試
class VariablePractice{
static int age ; //當變量要被靜態方法引用時,變量要靜態化
static char char1 = ‘r‘ ;
final int test = 99 ;
public static void main(String[] args){
age = 78 ;
int 年齡 = 26 ;
int test = 87 ;
System.out.println("大齡青年你的年齡是: "+年齡);
System.out.println(age);
System.out.println(char1);
System.out.print(test);
}
}
如上我們發現當存在一個成員變量時,我們在定義一個局部變量,且它們名字相同,這時在該局部變量所在方法中,成員變量暫時失效。
成員變量和局部變量都有各自的有效範圍:
J5. 變量與常量