1. 程式人生 > >Java之路:常量和變數

Java之路:常量和變數

常量(Constant)

1、定義

所謂常量,就是固定不變的量,其一旦被定義並初始化,它的值就不能再改變。

2、常量宣告

在Java語言中,常用關鍵字final宣告常量,語法如下:

// 方法1,推薦使用
final 資料型別 常量名 = 常量值;
// 方法2
final 資料型別 常量名;
常量名 = 常量值;


(1)常量名和前面講到的識別符號(識別符號、關鍵字與保留字)的命名規則一樣,可由任意順序的大小寫字母、數字、下劃線(_)和美元符號($)等組成,識別符號不能以數字開頭,亦不能是Java中的保留關鍵字。
(2)常量通常用使用大寫字母,單詞之間用下劃線連線,但這不是硬性要求,僅是一個習慣。
(3)雖然Java中有關鍵字const,但目前並沒有被Java正式啟用。
(4)在定義常量時,必須要對其進行初始化,否則會出現編譯錯誤。常量一旦初始化後就不能再改變其值。
(5)final

關鍵字不僅可以用來修飾基本資料型別的常量,還可以用來修飾引用資料型別的方法等。

【示例】

public class DefineConstant {
	public static void main(String[] args) {
		final int YEAR = 365;
		System.out.println(YEAR);
	}
}

【結果】

在這裡插入圖片描述

如果你想對YEAR進行修改,如下:

public class DefineConstant {
	public static void main(String[] args) {
		final int YEAR =
365; System.out.println(YEAR); YEAR = 366; // 錯誤, 常量值不能修改 System.out.println(YEAR); } }

【結果】
在這裡插入圖片描述

變數

1、定義

在程式執行期間同,隨時可能產生一些臨時資料,應用程式會將這些資料儲存在一些記憶體單元中,每個記憶體單元都用一個識別符號來標識,這些記憶體單元稱為變數,定義的識別符號就是變數名,記憶體單元中儲存的資料就是變數的值。

2、變數宣告

語法如下:

// 方法1
資料型別 變數名 = 變數值;
// 方法2
資料型別 變數名;
變數名 = 變數值;
// 例:
int num =
47;


(1)變數都遵循“先宣告,後使用”的原則。
(2)變數使用時,可以宣告變數的同時進行初始化,也可以先聲明後賦值。
(3)變數中每次只能賦一個值,但可以修改多次。
(4)變數名和前面講到的識別符號(識別符號、關鍵字與保留字)的命名規則一樣,可由任意順序的大小寫字母、數字、下劃線(_)和美元符號($)等組成,識別符號不能以數字開頭,亦不能是Java中的保留關鍵字。
(5)變數名的第一個單詞首字母小寫,從第二個單詞開始每
個單詞首字母大寫。例如:lineNumber、getLineNumber。但這不是硬性要求,僅是一個習慣。
(6)宣告變數的作用之一便是指定在記憶體中分配空間的大小。

3、變數作用域

變數是有作用範圍(Scope)的,也即作用域。一旦超出變數的作用域,就無法再使用這個變數。

按作用域範圍劃分,變數分為成員變數區域性變數

(1)成員變數

在類體內定義的變數稱為成員變數,它的作用域是整個類,也就是說在這個類中都可以訪問到定義的這個成員變數。

【例】

public class Demo {
	static int i = 47;	// 定義一個成員變數,作用域是整個類Demo
	public static void main(String[] args) {
		System.out.println(i);
	}
}

【結果】
在這裡插入圖片描述

(2)區域性變數

在一個方法或方法內程式碼塊中定義的變數稱為區域性變數,區域性變數在方法或程式碼塊被執行時建立,在方法或程式碼塊結束時被銷燬。區域性變數在進行取值前必須被初始化,否則會編譯錯誤。
Java存在塊級作用域,在程式中任意大括號包裝的程式碼中定義的變數,它的生命僅僅存在於程式執行該程式碼塊時。例如:for迴圈、while迴圈、方法或方法的引數列表裡。在迴圈裡宣告的變數只要跳出迴圈,這個變數便不能再使用。同樣,方法或方法的引數列表裡定義的區域性變數,當跳出方法體之外,該變數也不能使用了。

【示例】

public class LocalVar {

	public static void main(String[] args) {	// main方法引數列表定義的區域性變數args
		int sum = 0;	// main方法體內定義的區域性變數sum
		for(int i = 1; i < 5; i++)	// for迴圈體內定義的區域性變數i
			sum += i;
		System.out.println(sum);
	}
}

【結果】
在這裡插入圖片描述

【結果分析】
在範例中,就有3種定義區域性變數的方式。在第3行,在靜態方法main引數列表中定義的區域性變數args,它的作用範圍就是整個main方法體:以3行的左花括號“{”開始,以第8行的“} ”結束。
在第4行,在main方法體內,定義了局部變數sum。它的作用範圍從當前行(4行)到以第8行的“}”為止。
在第5行,把區域性變數i宣告在for迴圈裡,它的有效範圍僅在for迴圈內(5~6行),只要一離開這個迴圈,變數i便無法使用。
相對而言,變數sum的有效作用範圍從第4行開始,到第8行結束,for迴圈也屬於變數sum的有效範圍,因此sum在for迴圈內也是可用的。

【區域性變數在塊作用域的應用】

public class LocalVar {
	static int x = 10;
	public static void main(String[] args) {	
		int outer = 1;
		{	// 直接用{}來定義塊
			int inner = 2;
			System.out.println("inner = " + inner);
			System.out.println("outer = " + outer);
		}
			int inner = 3;
			System.out.println("inner = " + inner);
			System.out.println("outer = " + outer);
			
			System.out.println("In class lecer, x = " + x);
	}
}

【結果】
在這裡插入圖片描述
:塊作用域除了用for等迴圈或方法體的左右大括號來界定外,還可以直接用大括號{}來定義“塊”。

【變數塊作用域的巢狀】

  • Java中作用範圍是禁止巢狀的,而在C/C++中則是允許的。

在Java中,在方法(函式)內定義的變數,其作用範圍(包括方法的引數)是從它定義的地方開始,到它所作用範圍終結的位置處結束。如在方法的開始處定義了一個變數i,那麼直到該方法結束處,都不能再定義另一個同名變數i。再如,如果在一個for迴圈體中定義了變數i,那麼在這個for迴圈內不能再有同名變數,但出了for迴圈之後,是可以再次定義的。這就是作用域不能巢狀的意思。

而在C/C++中,作用域可以巢狀,甚至無限制地巢狀下去,這裡每對大括號之間就是一個獨立的作用域,內巢狀的同名變數覆蓋外遷套的同名變數。如下表所示。
在這裡插入圖片描述

  • Java中類與方法中變數作用域可以巢狀

在Java中,類與方法之間作用域是可以巢狀的,可以把整個類看做一個大的作用域,它定義的欄位(或稱資料成員)可被方法中的同名欄位所遮蔽,其行為類似於上表左側所示的C/C++的作用域巢狀。如下:

public class LocalVar {
	static int x = 10;
	public static void main(String[] args) {	
		int x = 20;
		System.out.println(x);	// 區域性變數覆蓋成員變數
	}
}

【結果】
在這裡插入圖片描述