26
學習目標: 宣告基本型別變數並設值 了解八種基本型別的數值表現範圍 了解不同型別的自動轉換 自訂常數 分辨關鍵字及合法的識別字 2 變數與基本資料型別

變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

學習目標:

○ 宣告基本型別變數並設值

○ 了解八種基本型別的數值表現範圍

○ 了解不同型別的自動轉換

○ 自訂常數

○ 分辨關鍵字及合法的識別字

第 2 章

變數與基本資料型別

Page 2: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-2

2-1 常數與變數

2-1-1 常數

所謂「常數」(Constant)就是用來表示某個數值的符號。例如,阿拉伯數

字:0、1、2、3…9,每個符號都代表某個數值,不同的組合可以表示其它數值。

以下是常數的一些簡單例子:

12 9.6 -456 -999.9

除了數值常數,字元和字串也有常數。在 Java,字元常數可以用單引號「‘」一前一後包起來,例如:

‘j’ ‘3’ ‘我’

字串常數是以雙引號「”」一前一後包起來,例如:

“沒喝過 Java, 但我會用 Java”

常數是個很基本的概念,或許有些人從來不會想到這個問題,但是對初學者

而言,了解這個概念是必要的。

Page 3: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-3

2-1-2 何謂變數

變數和常數都是代表某個數值的符號。變數是由程式設計者定義;常數的書

寫方式則是由程式語言定義。一個常數值符(literal)就表示一個數值,而變數所

代表的數值是可以變更的。打個比方,常數像是攤在地上的幾個蘋果,只要瞧一

眼就知道有幾個;而變數就像是一個箱子,裡面裝了數個蘋果,箱子內所裝的蘋

果數目是可以改變的。

以下是由硬體的角度來解說變數。26、3.3、-6 是數字常數,其中 26 為正整

數,3.3 是浮點數(floating-point,帶有小數點的數值,請參看《第 2-2-2 小節:

浮點數》),-6 是負數,這是數學上的歸類。在電腦上,數字不論是正整數、浮

點數或負數都是資料,皆以二進位的方式來存放。存放資料的地方就是所謂的記

憶體,而變數就是記憶體中的某一個小區塊。

在 Java 裡,我們不能指定哪個記憶體區塊要存放什麼值。但可以要求取得一

個記憶體區塊,並給予一個名稱,接著再將數值設定給該記憶體區塊。我們會以

下式為設定方式:

j = 36;

上式的意思是「把數值 36 存放到稱為 j 的某個小區塊記憶體內」。j 是位於

記憶體中的哪一個地方,對我們(人)來說並不重要,我們只要認得 j 就可以了。

在此,j 就是變數的名稱,36 是變數 j 的內容。j 的內容是可以變動的,例如:可

以把 j 的內容設成 49,這時候 j 的內容就不是 36 了。

變數既然是記憶體區塊,那它不應該只能存放數值吧?沒錯!變數是代表某

小塊記憶體,它可以存放數字以外的資料。在 Java 裡,變數依照存放的「東西」

可以分成兩類:參照參照參照參照(reference)和基本資料型別基本資料型別基本資料型別基本資料型別(primitive type)。參照變數可

以看成是代表物件的變數,其內容為參照參照參照參照(參考到物件實體的相對位址),參照

變數將在《第 5 章:陣列》討論。基本資料型別的變數可以依照不同的宣告方式,

將變數宣告成不同的資料型別,以利存放不同的資料,例如:整數、浮點數等。

Page 4: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-4

2-1-3 宣告變數

使用固定大小的記憶體區塊,來應付不同的資料型態,似乎是相當不明智的

做法。如果使用 2 個位元組(byte)的記憶體來存放某個人的名字,是一定擺不

下的。若使用 32 個位元組來存放某個學生某次考試的數學成績,似乎又太浪費記

憶體了。所以,在使用變數之前,必須設定變數所佔的記憶體大小。設定變數佔

記憶體大小的程式敘述就是「宣告變數」。

Java 已經預先為使用者定義好數種基本資料型別的大小,只要使用基本資料

型別的關鍵字就可以宣告變數。例如:以關鍵字 int 宣告的變數代表佔 4 個位元

組(32 bits)的記憶體。不論是以何種資料型別宣告變數,都是將資料型別關鍵

字放在變數名稱前面,以下就是以 int 宣告變數 j:

int j;

宣告變數的方式不論使用何種資料型別,都是將資料型別關鍵字放在變數名

稱前面宣告。宣告語法如下:

資料型別資料型別資料型別資料型別 變數名稱變數名稱變數名稱變數名稱;

如果要同時宣告多個相同資料型別的變數,可以使用逗號(,)將變數名稱隔

開,別忘了結尾的分號(;),語法如下:

資料型別資料型別資料型別資料型別 變數名稱一變數名稱一變數名稱一變數名稱一, 變數名稱二變數名稱二變數名稱二變數名稱二, 變數名稱三變數名稱三變數名稱三變數名稱三, … ;

下式是宣告多個整數變數的例子:

int i, j, k;

要在哪個地方宣告變數呢?在 Java 裡,並沒有限定變數宣告的位置,你可以

在任何需要使用到變數時宣告。為了程式的維護方便,通常會將變數宣告放在類

別、方法主體或敘述區塊的最前面,也就是左大括弧「{」的後面宣告。

Page 5: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-5

宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

一個好處,當程式越大時,我們可能會搞不清楚而重複宣告變數,這時候編輯器

會告訴我們發生錯誤了。因為相同名稱的變數不能重複宣告相同名稱的變數不能重複宣告相同名稱的變數不能重複宣告相同名稱的變數不能重複宣告,如此才不會發生資料

因無心而蓋掉的錯誤。

2-1-4 設值

變數宣告就是為了存放資料,所以常常會在宣告變數之後設定變數的值。一

般變數值的設定方式是以「=」來設定,方式如下:

i = 24;

也可以在宣告變數的同時,設定變數的初始值,方式如下:

int a = 123; int j = 520, k = 240;

在尚未進入物件導向的主題前,範例中的變數都會在 main()方法內宣告。方

法中所宣告的變數稱「自動變數自動變數自動變數自動變數」。自動變數在宣告之後必須設值(初始化)才能自動變數在宣告之後必須設值(初始化)才能自動變數在宣告之後必須設值(初始化)才能自動變數在宣告之後必須設值(初始化)才能

使用,否使用,否使用,否使用,否則程式會在編譯時產生錯誤則程式會在編譯時產生錯誤則程式會在編譯時產生錯誤則程式會在編譯時產生錯誤。

範例 2_1:變數宣告與設值

宣告變數時,同時設定初始值。若只宣告變數未設定初始值,則該變數不能

使用。

【 程 式 內 容 】 EX2_1.java

01 // 範例:EX2_1.java 02 class EX2_1 03 {04 public static void main(String [] args) 05 { 06 int a=123; 07 int i;08 int j=520, k=240; 09

Page 6: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-6

10 System.out.println(a); 11 //System.out.println("i="+i); 12 System.out.println(j+" "+k); 13 } 14 }

【 執 行 結 果 】

【 程 式 說 明 】

•第 10 行:輸出變數 a 的值。

•第 11 行:若取消此行的標註符號 //,則在程式編譯時發生錯誤。

•第 12 行:數值和字串以「+」運算後,其結果為字串。有關字串的連接將於

《第 10 章:java.lang 套件》討論。

2-2 基本資料型別

在 Java 裡,變數的資料型別可以依性質分成幾類:整數、浮點數、字元、布

林值(boolean,真假值)、字串、陣列及物件。物件是複雜的資料型別,可以自

訂大小及格式,字串和陣列也被視為物件。整數、浮點數、字元及布林值的資料

型別是 Java 內訂的資料型別,所以又稱為基本資料型別。

為了因應不同的需要,相同的資料型態(整數或浮點數),也可以利用不同

的關鍵字來區別其所佔的記憶體大小。例如,浮點數就有兩種準確度的選擇:float和 double。表 2-1 列出基本資料型態和可以使用的關鍵字,共 8種基本資料型別。

Page 7: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-7

基本資料型態基本資料型態基本資料型態基本資料型態 可用之型別關鍵字可用之型別關鍵字可用之型別關鍵字可用之型別關鍵字

整數 byte、short、int、long 浮點數 float、double 字元 char 布林值 boolean

表 2-1: 基本資料型別

2-2-1 整數

整數(integer)是不含小數的正數或負數,也是最常使用到的資料型態。Java將整數依照所佔的記憶體大小,訂定了 4 種不同的型別,分別是 byte、short、int及 long。表 2-2 為各型別的數值範圍及佔用的記憶體大小。

型別關鍵字型別關鍵字型別關鍵字型別關鍵字 名稱名稱名稱名稱 佔用記憶體佔用記憶體佔用記憶體佔用記憶體 數值範圍數值範圍數值範圍數值範圍

byte 位元組 8 bits -128 ~ 127(-27 ~ 27-1)

short 短整數 16 bits -32768 ~ 32767(-215 ~ 215-1)

int 整數 32 bits -2147483648 ~ 2147483647(-231 ~ 231-1)

long 長整數 64 bits -263 ~ 263-1 表 2-2: 整數資料型別的數值範圍

由表 2-2 可知,如果用來表示學生的成績,一般學生成績的範圍為 0~100 分

(不計小數),可以使用 byte 型別,因為 0~100 是介於-128~127 之間。若要表示

某天是一年裡的第幾天,則不能使用 byte 型別,而必須使用 short 以上的型別,

因為 1~365 範圍已經超過 -128~127。現在的個人電腦幾乎都是 32 位元,所以一

般會以 int 來宣告整數,需要更大的儲存量時才使用到 long。byte 和 short 是比較

少用到的整數型別。

有時我們會使用到八進位或十六進位的整數表示方式,這時候會以特定的符

號來表示此數值是八進位或十六進位。要表示一個八進位的數字時,會在數字前

面多加一個「0」;若要表示十六進位會在數字前面加上「0x」或「0X」。

Page 8: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-8

注意:八進位所使用的數字為八進位所使用的數字為八進位所使用的數字為八進位所使用的數字為 0~70~70~70~7;十六進位所使用的數字符號為;十六進位所使用的數字符號為;十六進位所使用的數字符號為;十六進位所使用的數字符號為 0~90~90~90~9 及及及及 a~fa~fa~fa~f(或(或(或(或

A~FA~FA~FA~F))))。以下是八進位及十六進位的變數設定方式。

int j = 012; //八進位的變數值設定

int k = 0x2a; //十六進位的變數值設定

int m = 0x1B0C; //十六進位的變數值設定

有時會指示常數為 long 資料型別,此時只要在數字尾端加上「l」或「L」即

可。下列是兩種不同的變數設定方式,一個是以一般整數(int 型別)來設定變數

值,另一個是以長整數來設定變數值。

long a = 123; //以一般整數設定給長整數變數

long b = 123L; //以長整數設定給長整數變數

long 型別變數所指定的常數值若超出 int 型別的範圍時,應該在數字尾端加

上 l 或 L,否則在編譯時將發生「integer number too large」的錯誤。

long a = 123456789123; //錯誤錯誤錯誤錯誤

long b = 123456789123L; //正確

若將 long 型別的數值設定給 int 型別的變數,會在編譯時發生錯誤。就像把

大箱子裡的東西裝到小箱子裡一樣,沒有人能保證一定裝的下(《第 2-3 節:不

同型別的值與變數》將討論不同型別的值與變數設定問題)。下式為錯誤的例子:

int c = 123L; //錯誤的設值錯誤的設值錯誤的設值錯誤的設值

範例 2_2:整數變數設值

以 0 為首的整數為八進位數值,以 0x 或 0X 為首的整數為十六進位數值。

【 程 式 內 容 】 EX2_2.java

01 // 範例:EX2_2.java 02 class EX2_2 03 {04 public static void main(String [] args)

Page 9: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-9

05 { 06 int a = 100; 07 int b = 0100; 08 int c = 0x100; 09 10 System.out.println(a); 11 System.out.println(b); 12 System.out.println(c); 13 } 14 }

【 執 行 結 果 】

【 程 式 說 明 】

•第 7 行:以八進位的數值設定給變數 b。

•第 8 行:以十六進位的數值設定給變數 c。

2-2-2 浮點數

「浮點數」這個有點奇怪的名詞,其實是從「floating-point」翻譯過來的,指

的是有帶小數點的數值。所謂帶小數點的數值,不只是指小於 1 的數值,並且還

包括像科學式科學式科學式科學式的數值表示法(或稱為指數式指數式指數式指數式),如:1.2E+30 指的就是 1.2 乘以 10的 30 次方。所以,浮點數可以表示出比 long 還要大上許多的數值,但浮點數也

有一些限制,除了其數值是有範圍之外,它的精確位數也是有限定的。

在 Java 裡有兩種浮點數的型別,分別是 float 和 double。表 2-3 為浮點數資料

型別的數值範圍及佔用記憶體大小。

Page 10: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-10

型別關鍵字型別關鍵字型別關鍵字型別關鍵字 名稱名稱名稱名稱 佔用記憶體佔用記憶體佔用記憶體佔用記憶體 數值範圍數值範圍數值範圍數值範圍

float 單精數 32 bits 1.4E-45 ~ 3.4E+38 -1.4E-45 ~ -3.4E+38

double 倍精數 64 bits 4.9E-324 ~ 1.79E+308 -4.9E-324 ~ -1.79E+308

表 2-3: 浮點數資料型別的數值範圍

除了可表示的數值範圍不同外,float 和 double 可精確位數也不同,float 的精

確位數為 7 位,而 double 的精確位數為 15 位。在使用 float 型別時要特別注意一

點,只要是帶有小數點或帶 E 的值一律視為 double,所以不能直接以帶有小數點

或帶 E 的數值設定給 float,而必須在數值後加上「f」或「F」,將數值指定成 float型別才能設值。以下是兩個正確的式子和一個錯誤的式子:

float ft1 = 1.23f; float ft2 = 1.234F; float ft3 = 1.234; //錯誤錯誤錯誤錯誤

float ft3 = 10E2; //錯誤錯誤錯誤錯誤

double 型別的值不能直接設定給 float 型別的變數。原理如同,禁止將大箱子

裡的東西全部都倒到小箱子裡一樣,如此可以避免裝不下而發生錯誤。另外,如

果常數的精確位數大於指定的型別可容納的位數時,則超出的部份會自動捨去。

若要強調數值為 double 型別時,可以在數值後加上「d」或「D」。

1.0 和 1e1 這些看起來簡單的浮點數可都是 double 型別,千萬別以為 1e1 是 int

型別的數值。

範例 2_3:浮點數變數設值

只要是帶小數點的數值或科學表示法的數值,皆為浮點數,且為 double 型別。

若欲讓浮點數為 float 型別必須在數值後加一個「f」或「F」。

Page 11: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-11

【 程 式 內 容 】 EX2_3.java

01 // 範例:EX2_3.java 02 class EX2_3 03 {04 public static void main(String [] args) 05 { 06 float ft1 = 1.23F; 07 float ft2 = 987654321.123456789F; 08 double db1 = 987654321.123456789; 09 double db2 = 168.8E-200; 10 11 System.out.println(ft1); 12 System.out.println(ft2); 13 System.out.println(987654321.123456789F); 14 System.out.println(db1); 15 System.out.println(db2); 16 } 17 }

【 執 行 結 果 】

【 程 式 說 明 】

•第 6 行:宣告並設定單精數變數 ft1。設值時,別忘了在數字末端加上型別符

號「f」或「F」。

•第 7 行:以「F」標示的數值即表示其為 float 型別,超出精確度的部份會被捨

去。

•第 8 行:超出 double 精確度的部份會自動被捨去。

•第 9 行:以指數式設定倍精數變數 db2。輸出時,若浮點數以指數式表示,則

底數的小數點前只有一位(標準的科學指數式)。

Page 12: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-12

2-2-3 字元

由於網路無國界,為了可以將世界上所有的文字都包含進來,所以有 Unicode(萬國碼)的誕生。Unicode 是以 16 bits 來表現一個字元,所以可以表現 65536個字元,其中包括中文、日文、韓文、德文、法文等多國文字。在 Java 裡,使用

的正是 Unicode,所以一個中文字也是一個字元,每個字元佔用每個字元佔用每個字元佔用每個字元佔用 2 bytes2 bytes2 bytes2 bytes((((16 bits16 bits16 bits16 bits))))。

宣告字元使用的是 char 關鍵字。字元會以單引號(’)包起來表示,例如:

char c = ‘A’; char d = ‘字’;

字元的設值也可以使用一般整數設定,範圍為 0 ~ 65535(0xffff),例如:

char c = 26131;

另一種字元表示法為 Unicode 表示法,以 ‘\\\\uXXXXuXXXXuXXXXuXXXX’ 表示一個字元,其中 X為十六進位的數字符號,而且必須為必須為必須為必須為 4444 位數位數位數位數,否則在編譯時會發生錯誤。例如:

char c = ‘\u74CF’;

有些特殊字元無法以鍵盤上的按鍵表示時,還可以使用倒斜線字元為開頭的

表示法,此種表示法稱為脫逸(脫逸(脫逸(脫逸(EscapeEscapeEscapeEscape)表示法)表示法)表示法)表示法,這些字元則稱為脫逸字元。

脫逸字元脫逸字元脫逸字元脫逸字元 意義意義意義意義

\b 退一格(backspace)。

\f 跳頁(form feed,使用於印表機)。

\n 換行(newline)。

\r 返回(carriage return)。

\t 水平跳格,相當於按鍵盤的 Tab 鍵。

\\ 表示 \ 字元。

\’ 表示 ’ 字元。

\” 表示 ” 字元。

表 2-4: 脫逸字元

Page 13: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-13

「為什麼這種方式叫做脫逸表示法呢?」有些字元在電腦看來是有特殊意義

的,所以在資料傳輸時,若其中包含了這些字元,可能會讓電腦誤以為要執行某

些動作,而造成不可預期的結果。為了避免這種情形,會以另一種方式表示這些

字元,此方式就稱為脫逸表示法。

範例 2_4:字元變數設值

字元的表示法除了以數值表示外,其餘的表示法都使用單引號「’」包圍起來。

【 程 式 內 容 】 EX2_4.java

01 // 範例:EX2_4.java 02 class EX2_4 03 {04 public static void main(String [] args) 05 { 06 char c1 = 'A'; //一般字元表示法07 char c2 = '\n'; //換行的脫逸字元08 char c3 = 26131; //以整數表示字元09 char c4 = '\t'; //tab的脫逸字元10 char c5 = '\u74CF'; //Unicode 字元表示法11 12 System.out.println(""+c1+c2+c3+c4+c5); 13 } 14 }

【 執 行 結 果 】

【 程 式 說 明 】

•第 12 行:以空字串為首將字元以「+」串接起來。若不以空字串為首,則會

被視為數值的相加。由於 c2 為換行字元,所以在印出「A」之後會換行,接

著才印出後續的字元。

Page 14: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-14

2-2-4 布林值

「什麼是布林值(boolean)呢?」布林值也叫真假值,不是真(布林值也叫真假值,不是真(布林值也叫真假值,不是真(布林值也叫真假值,不是真(truetruetruetrue),就是),就是),就是),就是

假(假(假(假(falsefalsefalsefalse)))),沒有第三種可能。布林值看起來是很簡單的變數,雖然它很簡單卻是

相當重要的。布林值和邏輯有密不可分的關係,程式中的流程都要靠布林值來判

斷。先不談布林值在程式流程中所扮演的角色是多麼重要,我們先來看如何宣告

及設定布林值。宣告布林變數是使用 boolean 關鍵字,設定其值時只能使用 true或 false,或者運算結果為 true 或 false 的運算式。

boolean b1 = true; boolean b2 = 18 > 17;

上式的大於(>)符號是比較運算子之一,它在比較左右兩邊數值之後會傳

回布林值。18 是大於 17 的,所以「18 > 17」會傳回 true。我們將在下一章仔細

討論 java 的各種運算子。

範例 2_5:布林值變數設值

布林值變數只有兩個可能的值:true 或 false。「<」和「>」為關係運算子「是

否小於」和「是否大於」,它們的運算式之運算結果都是布林值。

【 程 式 內 容 】 EX2_5.java

01 // 範例:EX2_5.java 02 class EX2_5 03 {04 public static void main(String [] args) 05 { 06 boolean b1 = true; 07 boolean b2 = 18 < 17; 08 09 System.out.println(b1); 10 System.out.println(b2); 11 System.out.println(18 > 17); 12 } 13 }

Page 15: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-15

【 執 行 結 果 】

【 程 式 說 明 】

•第 7 行:以邏輯運算式「18 < 17」的結果為值設定給 b2。

•第 11 行:輸出邏輯運算式「18 > 17」的結果。

2-3 不同型別的值與變數

在本小節之前的所有範例,都是以相同型別的值設定給相同型別的變數。而

且,在《第 2-2-2 節:基本資料型別》中,曾提到同樣是浮點數,double 值不可

以設定給 float 變數,那麼 float 值可不可以設定給 double 變數?答案是可以。我

們同樣以箱子的說法來說明,小箱子內的東西可以全部倒入大箱子,所以 float值可以設定給 double 變數。同理,byte、short、int 值可以設定給 long 變數。

那麼,不同資料型態的變數和值可不可以相互設定呢?在相同資料型態不同

型別的變數,是遵守著資料一定不會遺漏的原則;在不同資料型態,也是遵守這

個規則,但是有些額外的限制,歸納為以下數點:

� 同資料型態不同型別,小體積的型別值可以設定給大體積的型別變數,反之則同資料型態不同型別,小體積的型別值可以設定給大體積的型別變數,反之則同資料型態不同型別,小體積的型別值可以設定給大體積的型別變數,反之則同資料型態不同型別,小體積的型別值可以設定給大體積的型別變數,反之則

否否否否。

� booleanbooleanbooleanboolean 型別不同於其它基本型別,不能和其它基本型別相互成為設定值型別不同於其它基本型別,不能和其它基本型別相互成為設定值型別不同於其它基本型別,不能和其它基本型別相互成為設定值型別不同於其它基本型別,不能和其它基本型別相互成為設定值。

� charcharcharchar 型別可以視為型別可以視為型別可以視為型別可以視為 intintintint 型別,型別,型別,型別,但所有整數型別皆不能視為但所有整數型別皆不能視為但所有整數型別皆不能視為但所有整數型別皆不能視為 charcharcharchar 型別型別型別型別。

� 所有整數型別皆可以設定給所有浮點數型別,反之則否所有整數型別皆可以設定給所有浮點數型別,反之則否所有整數型別皆可以設定給所有浮點數型別,反之則否所有整數型別皆可以設定給所有浮點數型別,反之則否。

Page 16: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-16

此種不同型別間的轉換稱為自動型別轉換自動型別轉換自動型別轉換自動型別轉換(Automatic Type Casting)。圖 2-1為自動型別轉換之示意圖,順著箭頭方向可以自動轉換,反之則否。例如,byte型別可以自動轉換成 short、int、long、float 和 double,但不會自動轉換成 char型別。

byte b = 123; int j = b; float f = b; char c = b; //錯誤錯誤錯誤錯誤

byte short int long

doublefloat

char

8 bits 16 bits 32 bits 64 bits

圖 2-1: 自動型別轉換

byte 和 short 的變數雖然分別佔 8-bit 和 16-bit,然而 byte 和 short 型別的變數值

不可以指定給 char 型別的變數。

範例 2_6:自動型別轉換

byte 型別可以自動轉成 int 和 float 型別,但不能自動轉成 char 型別。

【 程 式 內 容 】 EX2_6.java

01 // 範例:EX2_6.java 02 class EX2_6 03 {04 public static void main(String [] args) 05 { 06 byte b = 123;

Page 17: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-17

07 int j = b; 08 //char c = b; 09 float f = b; 10 11 System.out.println(b); 12 System.out.println(j); 13 System.out.println(f); 14 } 15 }

【 執 行 結 果 】

【 程 式 說 明 】

•第 7 行:b 的變數內容先被轉換成 int 型別再設定給變數 j。

•第 8 行:若取消標註符號 \\,則編譯程式時會發生錯誤。

•第 9 行:b 的變數內容先被轉換成 float 型別再設定給變數 f。

2-4 自訂常數

在科學領域,常常會聽到像「地心引力常數」、「圓周率」、「亞佛加厥常

數」…等等的科學常數科學常數科學常數科學常數。這些稱之為常數的數值都是固定不變的。在程式中也可

能使用到不會再變更的數值,我們可以直接用數值來計算,像求三個圓形的周長

可以用:

System.out.println( 2*2*3.14 );System.out.println( 3*2*3.14 );System.out.println( 5*2*3.14 );

Page 18: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-18

上列 π的值以 3.14 替代,然而若要提高 π的精確度時,就比較麻煩了。你

可能會想到用一個變數來代表,這是個好主意!

float pi = 3.14159; System.out.println( 2*2*pi ); System.out.println( 3*2*pi ); System.out.println( 5*2*pi );

在小程式使用這種方式是沒問題的,不過在大程式裡,你有可能不小心會去

更改到 pi 這個變數,這個時候就很麻煩了。為了安全起見,我們可以利用 final關鍵字來宣告變數,使用 final 宣告並設定初始值之後,這個變數的值就不能再變

更。定義自訂常數的語法如下:

final 型別關鍵字型別關鍵字型別關鍵字型別關鍵字 常數名稱常數名稱常數名稱常數名稱 = 常數數值常數數值常數數值常數數值;

其實這種宣告方式也是變數宣告的一種,只是你不能再設定或變更其值,若

再重新設值時,則編譯時會發生錯誤。這種變數又稱為「變數常數」,不過,這

是個矛盾用詞,好比「巨大的小砂子」、「堅硬的軟糖」一樣,因此,還是稱為

「常數常數常數常數」比較恰當。另外要注意的是,宣告自訂常數時,一定要同時設定初始值才宣告自訂常數時,一定要同時設定初始值才宣告自訂常數時,一定要同時設定初始值才宣告自訂常數時,一定要同時設定初始值才

算合法算合法算合法算合法。

很明顯地,使用自訂常數有以下的優點:

� 若要變更所有的值時,只要變更初設值即可若要變更所有的值時,只要變更初設值即可若要變更所有的值時,只要變更初設值即可若要變更所有的值時,只要變更初設值即可。

� 常數名稱比數值容易了解常數名稱比數值容易了解常數名稱比數值容易了解常數名稱比數值容易了解。

� 避免不小心被更動避免不小心被更動避免不小心被更動避免不小心被更動。

Page 19: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-19

2-5 關鍵字及變數命名

2-5-1 關鍵字

在此之前已經看過很多次「關鍵字關鍵字關鍵字關鍵字」(keyword)這個名詞。「什麼是關鍵字

呢?」關鍵字就是在程式語言中,已經定義並代表特殊意義的字,使用者(程式

設定者)不能將其做為別的用途。例如:我們看過的 int、float、final 等,都屬於

關鍵字。

另外,有些特別的字稱為保留字保留字保留字保留字(reserved word),保留而不做為識別字識別字識別字識別字

(identifier)之用。關鍵字也屬於保留字,然而保留字不一定是關鍵字。相對於

關鍵字和保留字,識別字是程式設計者所定義的字,例如:類別名稱、方法名稱、

變數名稱等屬於識別字。

在 Java 1.4,有 47 個關鍵字和 5 個保留字。下表列出了 Java 所有的關鍵字及

保留字。

Java 的關鍵字

abstract assert boolean break byte case catch char class continue default do double else extends final finally float for if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while Java 的保留字

const goto true false null 表 2-5: Java 的關鍵字與保留字

Page 20: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-20

const 和 goto 為 C/C++的關鍵字,在 Java 則是保留而不使用。const 在 C/C++是用以自訂常數,Java 的自訂常數則是使用 final 修飾字。goto 經常會破壞 C/C++程式的結構化,為避免混淆,在 Java 亦保留而不使用。

true 和 false 為布林值型別的值符,故為保留值符(Reserved Literals)。null為參照變數(reference variable)的值,亦為保留值符。

assert 和 strictfp 是最晚加入的關鍵。assert 和程式的除錯有關,而 strictfp 和

浮點數的計算有關。所有的關鍵字和保留字都是小寫字母所有的關鍵字和保留字都是小寫字母所有的關鍵字和保留字都是小寫字母所有的關鍵字和保留字都是小寫字母,故某字有大寫字母出現

時,該字為非關鍵字。,為了方便記憶,以下將關鍵字分成 7 類:

� 基本型別基本型別基本型別基本型別:boolean、byte、char、double、float、int、long、short、void。

� 流程控制流程控制流程控制流程控制:if、else、do、while、for、switch、case、default、break、continue。

� 存取存取存取存取:import、package、private、protected、public。

� 修飾修飾修飾修飾:abstract、final、native、volatile、static、strictfp、synchronized、transient。

� 繼承繼承繼承繼承:class、extends、implements、interface、super、this。

� 例外控制例外控制例外控制例外控制:assert、throw、throws、try、catch、finally。

� 其它其它其它其它: instanceof、new、return。

上述的關鍵字中,畫底線的部份請特別注意。例如,protect 不是關鍵字,

protected 才是關鍵字。

2-5-2 變數的命名

變數名稱為「識別字」的一種。我們已經知道,變數名稱不可以是關鍵字或是變數名稱不可以是關鍵字或是變數名稱不可以是關鍵字或是變數名稱不可以是關鍵字或是

保留字保留字保留字保留字,除此之外,變數的命名還有一些需要注意的地方,歸納如下:

� 不能為關鍵字或保留字。不能為關鍵字或保留字。不能為關鍵字或保留字。不能為關鍵字或保留字。例如,你不能以 int 當作變數的名稱,因為 int 是用以

宣告整數型別的關鍵字。

Page 21: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-21

� 變數名稱的第一個字元可以為變數名稱的第一個字元可以為變數名稱的第一個字元可以為變數名稱的第一個字元可以為 UnicodeUnicodeUnicodeUnicode 字元(如中文字)、英文字母、底線符字元(如中文字)、英文字母、底線符字元(如中文字)、英文字母、底線符字元(如中文字)、英文字母、底線符

號(號(號(號(____)或者金錢符號()或者金錢符號()或者金錢符號()或者金錢符號($$$$、、、、£、、、、¥)。)。)。)。變數名稱的第二個字元以後,可以使用前

述的字元及數字元(0~9)。

� 避免在變數名稱中使用避免在變數名稱中使用避免在變數名稱中使用避免在變數名稱中使用$$$$。。。。因為含 $ 的識別字通常為編譯器所產生(例如匿名

的內部類別的 class 檔),為了避免不小心衝突,請儘量不要使用。 £ 和 ¥ 沒

有直接的按鍵,故很少用。

� 在相同變數領域,不能重複宣告一個變數名稱。在相同變數領域,不能重複宣告一個變數名稱。在相同變數領域,不能重複宣告一個變數名稱。在相同變數領域,不能重複宣告一個變數名稱。例如,已經在 main()方法中宣

告過 myAge 為 int 型別,不能再將 myAge 重新宣告為 float 型別。

上述的規則適用於所有識別字的命名,包括類別名稱和方法名稱。除了以上

的限制,變數名稱是有分大小的。例如:myAge、myage、Myage 都是不同的變

數名稱,所以使用上必須注意。一般都會以有意義的文字做為變數的名稱,例如:

year、guestName、age 等。而沒有意義的文字像是 AA、b1、C2、x、Z,盡量不

要拿來當變數名稱,以免增加程式解讀的困難。

「數字為什麼不能當作識別字的第一個字元?」若識別字的第一個字元可以

為數字,則會和數值有所衝突。例如,以下為一數值而不能為識別字。

2E17F

下列為合法變數名的一些例子:

card123 $my_money _test 變數

¥123 £good

判斷是否可以當做「識別字」是常考的題目,請熟記識別字的命名規則。

Page 22: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-22

習題

一、選擇題

1. 下列有關變數宣告及設定初值何者正確?

A. byte b = 300;

B. char c = “C”;

C. boolean boo = 1;

D. float f = 1.2;

E. int j = 007;

2. byte 型別可表現的數值範圍為何?

A. -128 至 128

B. -128 至 127

C. -127 至 128

D. 0 至 255

E. 0 至 256

3. 下列哪兩個基本資料型別佔用 32 bits?(2 個答案)

A. integer

B. int

C. long

D. float

E. double

4. char 型別可表現的數值範圍為何?

A. -215至 215-1

B. 0 至 216-1

Page 23: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-23

C. -216至 216-1

D. 0 至 216

E. 依不同的作業系統而定

5. 下列有關字元變數設定何者正確?

A. char c = ‘\x41’;

B. char c = ‘\x0041’;

C. char c = ‘\u41’;

D. char c = \u0041;

E. char c = ‘\u0041’;

6. 下列有關變數宣告及設定初始值何者錯誤錯誤錯誤錯誤?(2 個答案)

A. float f = 12.0F;

B. long n = 12.0;

C. double d = 0x5A6;

D. int j = 1E2;

E. char c = 0x41;

7. 已知如下的變數宣告,選項中何者正確?

byte aByte = 1; char aChar = 2; double aDouble = 3; float aFloat = 4; int aInt = 5; long aLong = 6;

A. aByte = aChar;

B. aInt = aLong;

C. aFloat = aLong;

D. aFloat = 2E2;

E. aLong = aDouble;

Page 24: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-24

8. 在 Java 中,8 進位的常數 6 如何表示?

A. 6(oct)

B. @6

C. 06

D. 0x6

E. 0u6

9. 下列何者不是不是不是不是關鍵字?(2 個答案)

A. final

B. short

C. integer

D. long

E. Final

10. 下列何者為關鍵字?

A. this

B. that

C. protect

D. then

E. synchronize

11. 下列何者為 Java 自訂常數的定義?

A. final n = 123;

B. final int n = 123;

C. const n = 123;

D. const int n = 123;

E. define n = 123;

Page 25: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

第 2 章 變數與基本資料型別

2-25

12. 下列何者為合法的變數名稱?(3 個答案)

A. _543_

B. 2dogs

C. $money

D. %percent

E. 小羊

13. 下列何者不可不可不可不可當作識別字?(2 個答案)

A. true_false

B. ¥jd

C. NULL

D. small-pig

E. _5.5

14. 下列哪兩個字為保留字而不為關鍵字?

A. const

B. include

C. sizeof

D. goto

E. gosub

Page 26: 變數與基本資料型別 - read.pudn.comread.pudn.com/downloads56/ebook/200271/電子書.Java2.新觀念教本...第2章變數與基本資料型別 2-5 宣告變數的用意,除了可以讓我們設定變數所佔的記憶體大小之外,還有另

2-26

二、程式練習

1. 寫一程式,將圓周率 pi 設定成常數(取到小數點後 5 位),並計算半徑分

別為 10、25、50 單位長的圓形面積。

2. 已知 int 型別可以表現的最大值為 2147483647。寫一程式,將 int 型別的最

大值設定給變數 a,再將 a+1 設定給變數 b,然後將 b 的值印出來。

3. 台灣有 23000000 人,若 91 年度平均每人應繳 9876 元的所得稅,寫一程式

計算所有的所得稅額。(提示:使用 long 型別變數)