Presentation is loading. Please wait.

Presentation is loading. Please wait.

第 3 章 變數.

Similar presentations


Presentation on theme: "第 3 章 變數."— Presentation transcript:

1 第 3 章 變數

2 本章提要 3-1 甚麼是變數? 3-2 資料型別 (Data Types) 3-3 基本型別 (Primitive Data Types)
3-4 參照型別 (Reference Data Types) 3-5 變數宣告技巧 3-6 常數 3-7 良好的命名方式

3 3-1 甚麼是變數? 如果您看過一些心算才藝表演的節目, 必定會對於這些神童們精湛的記憶與心算能力佩服不已。不過, 對於一般人來說, 找個地方, 比如說一張紙把題目給好好記下來, 然後再一步一步的慢慢計算, 才有可能算出正確的答案。事實上, 我們所使用的電腦也沒有高明多少, 當程式執行時, 也必須使用類似的方法將所需的資料存到特定的地方, 才能夠進行運算, 進而幫我們解決問題。

4 甚麼是變數? 還記得在第 1 章中提到過演算法嗎?電腦必須將您的輸入資料處理之後, 轉換成輸出資料, 也就是最後的結果。如果對應到剛剛所舉的心算例子, 算術的題目就是輸入的資料, 而所需的處理就是計算, 結果就是計算的答案。為了讓電腦可以計算算式, 電腦必須能夠像我們一樣找個地方把算式記下來, 這個地方就是變數(Variable)。換言之, 變數是用來存放暫時的資料, 以便後續的處理。

5 變數的宣告 讓我們先來看看以下這個程式:

6 變數的宣告 在這個程式中, 第 3 行的意思就是宣告 (Declare) 一個變數, 它的名字叫做 i, 而最前面的 int 則是說這個叫做 i 的變數可以用來存放整數 (Integer) 型態的資料。當 Java 編譯器看到這一行時, 就會幫您在程式執行時預留一塊空間, 讓您可以實際存放資料。

7 嚴格型別的程式語言 Java 是一種嚴格型別 (Strong-Typed, 或是 Strict-Typed) 的程式語言, 變數在使用前一定要先宣告, 並且明確標示所要儲存資料的類型。

8 變數的宣告 您可以把變數比擬成百貨公司或是賣場都有提供的保管箱, 那麼第 3 行程式的意思就等於是向櫃檯人員說 "麻煩給我一個可以放整數的保管箱!"。而在程式實際執行這一個敘述時, 就相當於櫃檯的服務人員去找出一個空的保管箱, 並且將保管箱的號碼牌給您。如此一來, 您就擁有一個可以存放物品的地方了。

9 設定變數的內容 如同前面所說, 變數就像是個保管箱, 那麼櫃檯服務人員所給的保管箱號碼牌就相當於是這個保管箱的名字。往後當您需要放置或是取出保管箱中的物品時, 都必須出示這個號碼牌, 讓櫃檯人員依據號碼找出保管箱來幫你取出或是放置物品。

10 設定變數的內容 變數的使用也是一樣, 宣告了變數之後, 往後要存放或是取出資料時, 只要指定變數的名字即可。像是程式中的第 4 行, 就是將 20 這個數值放入名字為 i 的變數中, 也就是將 20 這個物品放入 i 這個保管箱中。在這一行中的 "=", 稱為指定運算子 (Assignment Operator), 它的功用就是將資料放到變數中。

11 設定變數的內容

12 設定變數的內容 當您需要取出資料時, 只要在需要用到資料的地方寫上變數的名字, 實際執行程式時, 就會將資料由變數中取出, 並且取代變數名字出現在程式中的位置。 以第 5 行來說, “變數 i 的內容為:” 是原本就要顯示的訊息, 後面的 “ +” 稱為字串連接運算子 (Concatenation Operator), 它的功用是將一段文字與另一個資料結合起來, 成為一段新的文字。

13 設定變數的內容 由於剛剛才將 20 放入變數 i 中, 因此這裡就相當於是: 也就相當於是:

14 設定變數的內容 因此, 最後程式的執行結果就是將 "變數 i 的內容為:20" 這段文字顯示出來了。
要注意的是, 在 "變數 i 的內容為:" 中雖然也出現了變數 i 的名字, 但是因為使用了雙引號 " 括起來, 就會被 Java 視為是單純的一段文字, 而不會將其中的 i 解譯為變數的名字, 所以就不會以變數 i 的內容取代。

15 設定變數的內容 另外, 由於變數的內容是可以更換的 (保管箱中的物品本來就可以替換), 因此, 實際上是以執行當時變數的內容來取代變數名字出現的位置, 例如:

16 設定變數的內容

17 設定變數的內容 由於在第 6 行更改了變數的內容, 因此在第 7 行時顯示的就會是 40, 而不是之前的 20 了。

18 變數的名稱 在前面的範例中, 變數的名字只是很簡單的 i, 就字面來說, 看不出有任何的意義。為了方便閱讀, 最好可以為變數取個具有說明意義的名字。 舉例來說, 如果某個變數代表的是學生的年齡, 那麼就可以幫這個變數取個類似 age 的名字, 底下就是實際的範例:

19 變數的名稱

20 變數的名稱 這樣一來, 在閱讀程式的時候, 就更容易瞭解每個變數的意義與用途, 而且如果有變數用在與其意義不符的用途上時, 也很容易就會發現, 而這很可能就是造成程式執行有問題的原因呢。

21 變數的命名規則 識別字必須以英文字母開頭, 大小寫均可。另外, 也可以用 “_” 或是 “$” 這兩個字元開頭。像是 “3am” 或是 “!age” 就不能作為變數的名字。 跟著開頭字元之後的, 可以是符合前一條規則的字元, 或者是阿拉伯數字 0 ~ 9。像是 "apple" 或是 "apple1" 都可以作為變數的名字, 但 "apple!" 就不行。

22 變數的命名規則 識別符號的長度沒有限制, 您可以使用任意個數的字元來為變數命名。
識別符號不能和 Java 程式語言中的保留字 (Reserved Word) 重複。所謂的保留字, 是指在 Java 中代表特定意義的單字, 這主要分為兩類, 第一類是代表程式執行動作的關鍵字 (Keywords), 這些關鍵字會在後續的章節一一出現, 這裡先列表如下:

23 變數的命名規則

24 變數的命名規則 另外一類, 則是 Java 內建代表特定資料值的字面常數 (Literal), 包含代表布林值 (Boolean) 的 true 與 false;以及 null 這個用來表示沒有指向任何物件的參照 (Reference) 值。我們會在後續章節中深入探討這些字面常數。 以上這些列在關鍵字或是內建字面常數中的保留字, 都不能拿來作為識別字符, 當然也就不能作為變數的名稱。

25 變數的命名規則 字母相同, 但大小寫不同時, 視為是不同的名稱。所以程式中 age 和 Age 指的是不同的變數。
根據以上的規則, 底下的程式示範了幾個可以做為變數名稱的識別符號:

26 變數的命名規則

27 變數的命名規則 請注意第 3~5 行因為字母大小寫不同, 所以這 3 個變數名稱是不同的。
以下程式中的變數名稱就不符合規定, 在編譯的時候會出現錯誤訊息:

28 變數的命名規則

29 變數的命名規則 其中第 3 行的變數是以數字開頭, 而第 4、5 兩行的變數名稱使用了 "#“ 字元, 第 6 、7 兩行的變數名稱則分別用到了保留的關鍵字與字面常數, 這些都不符合 Java 對於識別符號的規定, 在編譯時就會看到錯誤的訊息:

30 變數的命名規則

31 變數的命名規則

32 變數的命名規則

33 請不要使用 " $ " 為變數命名 雖然在識別符號的命名規則中, 允許您使用 "$" 字元, 不過建議最好不要這樣做。因為Java 編譯器在編譯程式的過程中, 可能會有需要替我們建立額外的變數, 而這些變數的名稱都是以 "$" 字元開頭。因此, 對於 Java 軟體開發人員來說, "$" 字元開頭的變數代表的是由 Java 編譯器自動建立的變數。如果您自行宣告的變數也取了以 "$" 字元開頭的名字, 就會讓閱讀程式的人產生混淆。

34 使用標準萬國碼 (Unicode) 字元為變數命名
由於 Java 支援使用標準萬國碼 (Unicode), 因此前面命名規則中也可以使用許多 Unicode 字元, 包含中文等亞洲國家語言的文字在內。舉例來說, 底下這個程式就使用了中文來為變數命名:

35 使用標準萬國碼 (Unicode) 字元為變數命名

36 使用標準萬國碼 (Unicode) 字元為變數命名
除了變數名稱是中文以外, 這個程式就和 VariableName.java 一模一樣。 不過由於 Java 程式語言是以近似英文的語法構成, 如果在程式中夾雜中、英文, 不但會造成閱讀上的困擾, 軟體開發人員自己在撰寫程式時, 也得在中、英文輸入方式中切換, 並不方便。因此, 雖然以中文來為變數命名是合乎 Java 程式語言的語法, 不過建議您不要這樣做。

37 標準萬國碼 (Unicode) 在電腦中, 是使用數值 (稱為字碼, Character Code) 來代表文字, 而那個數值對應到那個字元, 就稱為文字編碼 (Character Encoding)。不過由於電腦最早是由西方起源, 逐漸於全球流行, 而在這個過程中, 每一個國家對於其所使用的文字都有一套編碼, 彼此間並不相容。同一個字碼對應到不同的語言時, 可能就代表了不同的字元。

38 標準萬國碼 (Unicode) 舉例來說, 即便是都有使用到漢字的台灣、中國、日本以及韓國來說, 對於同一個漢字, 在這四個國家所慣用的編碼裡對應的數值就不一樣。如此一來, 當電腦看到某個代表文字的數值時, 就必須先界定要套用哪一種編碼, 才能顯示出正確的文字。

39 標準萬國碼 (Unicode) 為了解決這個問題, 資訊學家就發明了所謂的標準萬國碼, 以 16 位元編碼, 希望能夠用單一一套編碼, 將全世界的文字通通納入。這樣一來, 不論是日文、中文、韓文也好, 都可以用同一套編碼, 而且也不會發生同樣的字碼卻代表不同字元的情況。 目前, 主要的作業系統以及程式語言都支援標準萬國碼, 因此, 撰寫中文應用程式並不會有無法處理中文的問題。

40 3-2 資料型別 (Data Types) 一般而言, 程式所需要處理的資料並不會只有一種, 像是之前範例中僅有整數資料的情況其實是很少見的。在這一節中, 就要跟大家介紹 Java 程式語言中所能夠處理的資料種類, 以及這些資料的表達方式。 在 Java 中, 每一種可以處理的資料種類, 稱為資料型別 (Data Types)。舉例來說, 除了整數以外, Java 也可以處理帶有小數的數值:

41 資料型別 (Data Types)

42 資料型別 (Data Types) 在這個程式中, 第 4 行就宣告了一個 double 型別的變數 d, 且在第 6 行設定了這個變數的內容為 3.1。另外, 在第 7 行中, 使用 " +" 這個運算子將變數 d 的內容與變數 i 的內容相加, 再將相加的結果放回變數 d 中, 所以最後變數 d 的內容會變成 23.1。

43 資料型別 (Data Types) 您可能會覺得疑惑, 之前不是說明過, "+" 是連接運算子, 會將文字連接在一起, 怎麼又變成加法了呢?其實是這樣的, " +" 運算子會根據前後的資料型別, 進行不同的動作, 如果前後的資料中有文字的話, 就是連接的運算;如果前後都是數值, 進行的就是加法。

44 " = " 的意義 如果您以前沒有學習過其他程式語言, 那麼很可能會對這裡的 “=” 與數學中的等號感到混淆。Java 中的 “=” 稱為指定運算子 (Assignment Operator), 與數學的等號一點關係都沒有。事實上, 它是指定的意思, 您可以把它讀成把右邊的算式計算出結果後, 放到左邊的變數中。

45 " = " 的意義 因此, DoubleDemo.java 中的第 7 行:
就應該解讀為 "將 d+i 計算後的結果 ( ) 放入變數 d 中", 所以最後顯示出來 d 的內容就是 23.1 了。

46 Java 到底可以處理那些資料型別呢? 我們可以先粗略的將 Java 中的資料分成兩種, 第一種是基本型別 (Primitive Data Types), 第二種則是參照型別 (Reference Data Types), 這兩種資料型別最簡單的區分方式如下:

47 基本型別 這種型別的資料是直接放在變數中, 像是之前使用過的整數以及浮點數, 都屬於這種資料。

48 參照型別 這種型別的資料並不是放置在變數中, 而是另外配置一塊空間來放置資料, 變數中儲存的則是這塊空間的位址, 真正要使用資料時, 必須參照變數中所記錄的位址, 找到儲存資料的空間。

49 3-3 基本型別 (Primitive Data Types)
您可以將各種基本型別想像成不同種類的物品, 對於 Java 來說, 基本型別可以分為兩大類:布林型別 (Boolean Data Type) 與數值型別 (Numeric Data Type)。

50 布林型別 (Boolean Data Type)
布林型別的資料只能有兩種可能值, 分別是true 與 false , 通常用來表示某種情況成立或是不成立, 我們會在第 5、6 章討論流程控制的時候看到布林值的用途。以下是一個簡單的範例:

51 布林型別 (Boolean Data Type)

52 布林型別 (Boolean Data Type)
在第 3 行中宣告了一個布林值的變數 test, 並且在第 4 行設定它的值為 true。第 5 行是一個 if 判斷, 它會計算後面小括號內的運算式, 如果是 true, 就會執行後面的區塊, 否則就跳過後面的區塊, 直接到區塊後再繼續執行。

53 布林型別 (Boolean Data Type)
以本例來說, 因為第 4 行時設定了 test 的值為 true, 因此, if 後面括號的計算結果就是 true, 所以會執行區塊中顯示 test 變數內容的程式。 如果您把第 4 行改為將 test 設定為 false, 那麼程式執行時就會略過 if 區塊, 甚麼都不顯示了。

54 數值型別 (Numeric Data Type)
數值型別可區分為 2 大類, 分別是整數型別 (Integral Data Type) 與浮點數型別 (Floating Point Data Type), 如果您所處理的資料完全沒有小數, 那麼只要使用整數型別的資料即可, 否則的話, 就可以使用浮點數型別。 在這兩大類的數值型別中, 又分別依據所能表示的數值範圍, 再細分為幾種資料型別, 以下分別介紹這兩大類的數值型別。

55 整數型別 (Integral Data Type)
整數型別可以細分為 byte、short、int、long、以及 char 這 5 種資料型別, 下表列出這些資料型別所能表示的整數範圍:

56 整數型別 (Integral Data Type)
要表示整數值的時候, 可以使用 10 進位、16 進位、或是 8 進位的方式, 以下分別說明之: 10 進位:以非 0 的數字開頭的數值就是 10 進位的數值, 例如 123 、10 、19999。

57 整數型別 (Integral Data Type)
16 進位:以 0x 或是 0X 開頭的數值就是 16 進位的數值, 您可以任意採用大寫或是小寫的 "a" ~ "f" 字母來表示 10 進位的 10~15。例如 0x11 就是 10 進位的 17, 而 0xff 或是 0XFF 、0xfF 都是 10 進位的 255。 8 進位:以 0 開頭的數值就是 8 進位的數值, 例如 077 就是 10 進位的 63。 不論是 0 、00 、或是 0x0 、0X0, 都代表數值 0。

58 整數型別 (Integral Data Type)

59 整數型別 (Integral Data Type)

60 有關於整數數值的表示, 還有以下需要注意的事項
您可以在數值前面加上 "-" 符號, 表示這是一個負數, 例如 -123、-0x1A。也可以加上 "+" 符號, 表示為一個正數。若沒有加上任何正負號, 則預設為正值。 Java 預設會把整數數值當成是 int 型別, 如果要表示一個 long 型別的數值, 必須在數值後加上 l 或是 L, 例如 123L 、 l。

61 有關於整數數值的表示, 還有以下需要注意的事項
舉例來說, 如果您忘記標示為 long 型別, 那麼當數值超過 int 型別的可表示範圍時, 會出現編譯錯誤:

62 有關於整數數值的表示, 還有以下需要注意的事項
其中第 4 行的整數數值已經超過 int 型別的最大值 , 編譯時會出現錯誤。 只要修正這項錯誤, 即可正確執行:

63 有關於整數數值的表示, 還有以下需要注意的事項

64 請使用大寫的 L 雖然您可以使用 "l" 或是 "L" 字尾來標示 long 型別的數值, 不過因為英文字母 "l" 容易和阿拉伯數字 "1" 混淆, 因此建議您使用大寫的 "L"。

65 整數型別中的 char 另外, 在整數資料型別中, char 是比較特別的一種, 它主要是用來表示單一個字元 (以英文來說, 這就是一個英文字母, 以中文來說, 就是一個中文字)。 正因為 char 型別的特性, 所以在設定資料值時可以使用數值、也可以用字元的方式, 例如:

66 整數型別中的 char

67 整數型別中的 char 其中第 4 、6 行就是以字元的方式設定資料值, 您必須使用一對單引號 (') 將字元括起來。第 8 行的設定就是使用數值, 此時這個數值代表的是標準萬國碼的編碼, 實際顯示變數內容時, 就會顯示出該字碼對應的字元。

68 跳脫序列 雖然如此, 但我們並不建議您這樣使用 char 型別的資料, 因為這樣的程式無法彰顯原來 ch 是 char 型別的資料。
如果需要直接以字碼的方式設定資料值, 那麼可以使用跳脫序列 (Escape Sequence) 的方式, 用法如下:

69 跳脫序列 '\XXX' :其中 XXX 是字元以 8 進位表示的字碼, 必須位於 0 ~ 377 之間, 也就是說, 這種方式只能表示字碼位於 10 進位數值 0 ~ 255 之間的字元。 '\uXXXX' :其中 XXXX 是字元以 16 進位表示的字碼。請注意, 一定要用4 位數。

70 跳脫序列 這樣不但可以直接指定字碼, 而且因為有一對單引號, 可以明顯看出這是一個字元。另外, 跳脫序列也可以用來指定一些會引起編譯器混淆的特殊字元, 比如說要設定某個 char 變數的內容為單引號時, 如果直接寫 ''', 那麼編譯器看到第 2 個單引號時, 便以為字元結束, 不但變成前面兩個單引號沒有包含任何字元, 而且第 3 個單引號也變成多餘。

71 跳脫序列 以下是跳脫序列可以表示的特殊字元, 裡頭包含了一些無法顯示的字元:

72 跳脫序列

73 跳脫序列 程式中分別以 8 進位及 16 進位的數值來設定資料值為字元 ‘b’, 另外也示範了設定特殊字元的方式。

74 特殊字元 在跳脫序列所能表示的特殊符號中, 有一些是沿用自過去打字機時代的符號, 表示打字機要做的動作, 而不是要列印的字元。
舉例來說, \r 是讓打字機的印字頭回到同一行的最前面, 而 \f 則是退出目前所用的紙。這些字元有部分對於在螢幕顯示文字或是使用印表機列印 (尤其是早期的點矩陣印表機) 時也都還有效用。

75 浮點數型別 (Floating Point Data Type)
浮點數資料依據所能表示的數值範圍, 還可區分為 float 與 double 兩種, 下表列出可表示的浮點數數值範圍:

76 表示浮點數的方式 帶小數點的數值:例如 3.4、3.0、0.1234。如果整數部分是 0 的話, 也可以省略整數部分, 像是 .1234。同樣的, 如果沒有小數, 也可以省略小數, 例如 3。 使用科學記號:例如 1.3E2、2.0E-3、0.4E2, 指數部分也可以用小寫的 e。同樣的, 如果有效數字中整數部分是 0 的話, 也可以省略, 像是.4E2。如果有效數字中沒有小數, 也可以省略小數, 例如 2E-3。

77 使用浮點數

78 使用浮點數

79 使用浮點數

80 使用浮點數 要注意的是, Java 會將任何帶有小數點的數值視為是 double 型別, 如果您希望將之用在 float 型別的場合, 就必須在數值後面加上一個 "f" 或是 "F", 例如:

81 使用浮點數

82 使用浮點數 這是因為 double 型別的資料可以表示的數值範圍要比 float 型別的資料大, 如果直接將 double 型別的資料放到 float 型別的變數中, 有可能會超出合法的數值範圍。因此, 必須先明確地將數值當成是 float 型別, 才能放入 float 變數中。

83 使用浮點數 加上 "f" 字尾的意思, 就等於是告訴 Java 說, 這個 3.1 只會拿來當作 float 型別的資料使用, 不需要花費 double 型別的空間來儲存。這樣一來, Java 就會把 3.1 當成 float 型別的數值。 如果有必要, 您也可以使用 "d" 或是 "D" 來強調某個浮點數值為 double 型別。

84 3-4 參照型別 (Reference Data Types)
參照型別比較特別, 我們以保管箱來比擬。如果賣場提供的服務夠好, 可以依據你所帶來的物品大小即時訂做保管箱, 那麼參照型別的功效也是如此。 首先, 當你需要保管箱放置物品時, 因為不知道物品有多大, 所以會先配給你一個固定大小的保管箱, 不過這個保管箱並不是用來放置你的物品。

85 參照型別 (Reference Data Types)
等到服務人員看到您需要保管的物品後, 會依據物品的大小, 立刻訂做剛好可以放這個物品的保管箱, 然後把保管箱的號碼牌放到之前配置的固定大小的保管箱, 最後將這個固定大小的保管箱的號碼牌給你。往後當你需要取出物品時, 就把號碼牌給服務人員, 服務人員就從保管箱中取出真正放置物品的保管箱的號碼牌, 然後再依據這一個號碼牌到真正放置物品的保管箱取出物品。

86 參照型別 (Reference Data Types)

87 參照型別 (Reference Data Types)
由於真正要放置的物品大小不一, 因此, 這樣做的好處是, 只要準備好可以放置號碼牌的保管箱, 真正需要放置物品時才把適合這個物品大小的保管箱做好, 不但可以應付不同大小的物品, 而且也可以有效利用空間, 不用事先先浪費空間準備足夠存放這類物品的保管箱。

88 參照型別 (Reference Data Types)

89 參照型別 (Reference Data Types)
參照型別主要是用在所需空間大小不一的資料。在 Java 中, 共有 3 類參照型別, 分別是字串 (String)、陣列 (Array)、以及物件 (Object)。事實上, 字串與陣列也是物件, 只是在 Java 中, 對於這兩種物件有特殊的支援, 所以把它們當成是兩種單獨的資料型別。稍後在第 7、8 章介紹陣列和物件。在第 10 章詳細介紹字串, 但由於字串在後續的範例中使用頻繁, 因此這裡先做個簡單的認識。

90 字串 (String) 型別

91 字串 (String) 型別

92 字串 (String) 型別的注意事項 字串型別的資料值必須以雙引號括起來, 就像是第 4 、5 行所示範。
字串可以使用 + 來連接, 這在之前的範例中已經看過許多次。

93 特殊的 String 型別 您可能已經發現到, 基本資料型別的型別名稱都是小寫的字母, 但是 String 型別卻是字首字母大寫, 這可以給您一個暗示, 表示 String 必定和基本資料型別有所差異, 目前您至少知道 String 是參照型別, 在後續的章節還會揭露其他不同的地方。

94 字串 (String) 型別 除了可以使用連接字串以外, String 型別還有一個特別的功能, 就是可以使用 length 方法來取得所儲存字串的長度 (也就是字串中包含有幾個字元)。 有關於甚麼是方法, 會在第 8 章介紹, 在這裡您只要知道如果 s 是一個 String 變數, 那麼 s.length() 就會取得 s 所指字串的長度即可。例如:

95 字串 (String) 型別

96 字串 (String) 型別

97 3-5 變數宣告技巧 一次宣告多個變數 變數的初值

98 一次宣告多個變數 如果您有多個相同型別的變數, 可以使用逗號 (",") 分隔, 在單一敘述中同時宣告, 而不需要為每一個變數都使用單獨的敘述進行宣告。請看以下的程式:

99 一次宣告多個變數

100 一次宣告多個變數 在第 3 行中就同時宣告了 4 個變數, 同樣的程式也可以寫成這樣:

101 一次宣告多個變數

102 變數的初值 您也可以在宣告變數的同時, 就設定該變數的初值。舉例來說, 以下的程式就和前面 Variable.java 的執行結果一樣:

103 變數的初值

104 變數的初值 這個程式就在宣告變數 i 的時候, 同時以指定運算子設定變數的初值。利用這種方式, 就可以省掉額外撰寫設定變數內容的敘述了。
這項功能也可以和剛剛所提到同一敘述宣告多個變數的作法並用, 例如:

105 變數的初值

106 變數的初值 甚至可直接用運算式來設定變數的初值:

107 3-6 常數 另外有一種資料和變數相對, 稱為常數 (Constant)。顧名思義, 變數所存放的資料隨時可以改變, 因此稱為變數, 那麼常數所儲存的資料則是恆常不變, 因此稱之為常數。 在 Java 中, 有兩種形式的常數, 一種稱為字面常數 (Literal), 另一種稱為具名常數 (Named Constant)。

108 字面常數 (Literal) 所謂的字面常數, 就是直接以文字表達其數值的意思。以 MultipleVariableInitAll.java 程式為例:

109 字面常數 (Literal) 其中第 3 行設定變數初值的敘述中, 10、20、30 就是字面常數, 直接看其文字, 就可以瞭解其所代表的數值。 使用字面常數就是這麼簡單, 不過有幾點需要注意:

110 字面常數 (Literal) 有些資料型別必須在字面常數的數值之後加上代表該型別的字尾, 例如用 "f" 或 "F" 代表 float 型別、"d" 或 "D" 代表 double, 請參考前面講述各資料型別的內容。 char 型別的字面常數以字元來表達時, 必須以單引號括起來, 例如 'a'。

111 字面常數 (Literal) 如果要表示一串文字, 則必須用一對雙引號 (") 括起來, 例如 "這是一串文字" 。您也可以在雙引號之間使用跳脫序列來表示特殊字元, 例如" 這裡換行 \n"。

112 具名常數 (Named Constant) 有時候我們會需要使用一個具有名字的常數, 以代表某個具有特定意義的數值。舉例來說, 您可能會希望在程式中以 PI 這樣的名稱來表示圓週率, 這時就可以使用具名常數 (Named Constant)。例如:

113 具名常數 (Named Constant)

114 具名常數 (Named Constant) 只要在宣告變數時的資料型別之前加上 final 字符, 就會限制該變數在設定初值之後無法再做任何更改。也就是說, 往後只能取得該變數的值, 但無法變更其內容, 我們稱這樣的變數為具名常數。

115 具名常數 (Named Constant) 在 NamedConstant.java 中, 第 4 行就透過這種方式宣告了一個代表圓周率的變數 PI, 並且在第 5、6 行使用 PI 與代表半徑的變數 r 計算圓週及圓的面積, 其中 "*" 稱為乘法運算子 (Multiplier), 可以進行乘法運算。 和一般變數一樣, 具名常數並不一定要在宣告時就設定初值, 所以同樣的程式也可以寫成這樣:

116 具名常數 (Named Constant)

117 具名常數 (Named Constant) 不過一旦設定值後, 就不能再更改了。 當然, 您也可以不使用具名常數, 而改用字面常數:

118 使用具名常數的好處 具說明意義:具名常數的名稱可說明其所代表的意義, 在閱讀程式時容易理解。像是前面程式中的 PI, 就可以知道代表圓周率。
避免手誤:舉例來說, 如果在 Constant.java 的第 5 行把 3.14 打成 4.14, 那程式就錯了。如果使用到同一常數的敘述很多, 就很容易出現這樣的錯誤。如果改用具名常數, 那麼當您手誤打錯名稱時, 編譯程式就會幫您找出來, 避免這樣的意外。

119 使用具名常數的好處 方便修改程式:舉例來說, 假設我們希望圓周率的精確度高一些, 而將原本使用的 3.14 改成 , 如果使用具名常數, 就只要修改 NamedConstant.java 的第 4 行;否則就必須在 Constant.java 中, 找出每一個出現 3.14 的地方, 改成 。

120 3-7 良好的命名方式 變數的名稱通常都以小寫字母開頭, 且應該能說明變數的用途, 如有必要, 請組合多個單字來為變數命名。例如, 一個代表學生年齡的變數, 可以取名為 age , 或是更清楚一點的 ageOfStudent。 為了方便閱讀, 同時也避免撰寫程式時手誤, 在組合多個單字來為變數命名時, 可以採取字首字母大寫的方式, 像是 ageOfStudent;或是使用 "_" 字元連接多個單字, 像是 age_of_student。

121 良好的命名方式 當組合的單字過長時, 可以採用適當的首字母縮寫, 或是套用慣用的簡寫方式, 像是把 secondHandBook 改成 sndHandBook , 或是把 redGreenBlue 改成 rgb , 都是不錯的作法。

122 良好的命名方式 如果程式中變數數量很多, 尤其又有名稱相近但是型別不同的變數時, 建議可以為不同型別的變數名稱加上一個字頭, 以彰顯其為某種型別的變數。例如, 用 i 代表 int 型別, 那麼代表學生年齡的整數變數就可以取名為 iAgeOfStudent。

123 良好的命名方式 對於具名常數, 一般慣例都是採全部大寫字母的命名方式, 以彰顯其為常數, 不應該出現在設定變數內容的敘述中。像是上一節範例中的具名常數 PI, 就是明顯的例子。這種命名方式一方面方便您撰寫程式時減少錯誤, 一方面也可以讓閱讀程式的人很清楚的看到這些具名常數。您也可以使用 "_" 來連接多個單字, 幫具名常數取個好名字。


Download ppt "第 3 章 變數."

Similar presentations


Ads by Google