Java 程式設計(一)含程式邏輯:第二章 Java 程式架構與輸入/輸出 上一頁 下一頁
翻轉工作室:粘添壽
2-3 變數型態與宣告
『變數』(Variables)可以想像為某容器的代表名稱,容器內『數值』可隨時改變,因而稱之。一般程式運作時,大多是處理變數之間內容的運算、遷移、複製、集合或排列等等,簡單的說,程式運作是離不開變數處理的。變數之間內容處理的現象,與一般數學演算至為相似,早期『計算機』(Computer)就是依照這個概念發展而來的。
其實『變數』即是電腦的某一記憶體空間,我們將這空間取一個比較容易有意義的名稱,此即是『變數名稱』(Variable name)。另一方面,除了希望記憶體空間能夠充分使用外,也期望不要浪費 CPU 處理時間,因此依照變數可能存放的內容,限制其空間大小。我們則將可能儲存的資料內容,區分為若干個型態,稱之為『資料型態』(Data type);並規劃各種資料型態可能佔用的記憶體空間,也限制了某一資料型態可能表示『數值』(Value)的範圍。
變數是存放數值的容器,但它的內容僅能被『存放』(或稱指定)與『複製』,並沒有『轉移』或『附加』的功能,也不可能出現『淨空』的現象,這方面與一般真實環境的容器(如杯子)有很大的不同。簡單的說,變數內一定有數值,而此數值僅能被複製到另一個容器,或被覆蓋成另一個數值,並無法將變數的內容移出成淨空狀態。以下我們依照常用的變數處理動作來介紹其特性如何。
(A)變數的宣告產生
一般程式語言皆會規劃幾種變數的資料型態,不同型態可儲存各種專屬資料。譬如,將某一變數宣告成整數型態(Integer, int),它僅能存放沒有小數點的資料,雖然有許多不方便,但所占用的記憶體空間小,處理速度較快,某些情況下還是值得的。圖 2-6 為宣告一個整數變數的語法:『int a;』,確實的讀法是『宣告一個名稱為 a 的整數變數』;系統執行該命令時,會由主記憶體內取得一個空間(4 bytes),並 a 來代表該記憶體空間的位址。
圖 2-6 變數的宣告產生
(B)指定變數內容
指定變數內容的功能是將某一數值存入變數內,無論原來變數內儲放任何數值,都會覆蓋掉,由新的數值取代。指定內容是變數與一般真實環境的容器之間最大的不同點,一般容器允許加入(或稱附加)數值,譬如,原來內如是 3,吾人再加入 5,使其結果為 8;但變數則不然,它沒有附加的功能,原來內容是 3,如再加入 5, 則原來的 3 將被覆蓋,而由 5 取代其內容。圖 2-7 顯示指定變數內容的功能。
圖 2-7 變數內容的指定
(C)宣告變數並指定內容
許多情況可以利用一個敘述句,完成宣告變數與指定內容,如『int a=5;』,確實的讀法是:『宣告一個整數變數,其名稱為 a,並給予內容 5』;此敘述的運作,結合了圖 2-6(int a;)與 2-7(a=5;)兩只命令。
(D)變數內容複製
其實,變數內容是無法移除或附加,僅能被複製或覆蓋。指定變數內容即是覆蓋的意思;但吾人亦可將某一變數的內容複製到另一變數內。圖 2-8(int b=a;)功能是:『宣告一個名稱為 b 的整數變數,並將變數 a 的內容複製到 b 內』,執行該命令後,變數 a 與 b 的內容都是 5。
圖 2-8 變數內容的複製
(E)變數內容的變更
變數內容變更情況如圖 2-9(a = a+10)所示,功能是『將 a 變數內容複製一份出來,與 10 做相加運算的結果再存入 a』,如原來 a 的內容是 5 的話,執行該命令後,a 的內容成為 15。
圖 2-9 變數內容的變更
(F)變數之間的運算
圖 2-10 為兩變數之間的運算程序(a = a + b),功能是將變數 a 與 b 複製一份出來,兩者相加之後,再將結果回存到 a 內;除了加法之外,其他運算器(加、減、乘、除、、)皆如此。如果原來 a 內容為 15、b 為 5,運算後 a 的內容被變更為 20,但 b 還保持原來的 5。
圖 2-10 變數之間的運算
每只變數都會依照他預計儲存的資料格式,給予特定記憶體空間大小;變數的記憶體空間越大,可以儲存的資料內容也就越多。雖然給予變數較大的記憶體空間,可以預備它儲存較複雜的資料,但如果沒有充分使用,就會浪費空間。因此,我們將程式可能儲存的資料分為幾種型態,產生變數時,就依照這些型態來規劃,則稱為『基本資料型態』。簡單的說,它就是產生變數的格式,基本資料型態所占用記憶體空間,與它可以容納資料量的範圍如表 2-1 所示。
表 2-1 Java 基本資料型態
資料型態 |
長度 (位元數) |
範圍 |
byte |
8 |
-128 ~ 127 (-27 ~ 27-1) |
short |
16 |
-32768 ~ 32767 (-215 ~ 215-1) |
int |
32 |
-2147483648 ~ 2147483647 (-231 ~ 231-1) |
long |
64 |
-9223372036854775808 ~ 9223372036854775807 (-263 ~ 263-1) |
float |
32 |
負值:-3.4028234663852886 x 1038 ~ -1.40129846432481707 x 10-45 正值:1.40129846432481707 x 10-45 ~ 3.4028234663852886 x 1038 |
double |
64 |
負值:-1.7976931348623157 x 10308 ~ -4.94065645841246544 x 10-324 正值:4.94065645841246544 x 10-324 ~1.7976931348623157 x 10308 |
char |
16 |
ISO 萬用碼 (Unicode) |
boolean |
|
不同平台有不同表示方式 |
String |
|
字串物件 |
我們可以將表 2-1 變數型態分類如下:
(A) 整數(byte、short、int、long):被宣告成此型態的變數,僅能存放沒有小數點的數值,但允許正數或負數。依照所欲儲存數值的大小可以選擇,byte、short、int 或 long。選擇較大者(如 long)可存放較多的數值,但佔用記憶體空間較大,CPU 執行速度較慢;相反的,選擇較小執行速度較快,但存放數值可能超載,到底取哪一樣較恰當,程式設計師可要一使用情況來判斷。
(B) 浮點數(float、double):被宣告此型態的變數,可以儲存具有小數點的正或負數值。Float 型態佔用記憶體空間較小,所能表示範圍較小;Double 具有雙倍記憶體空間,所能表示範圍較大,儲存小數點的位數可以較長,又稱為『雙倍精準度』。
(C) 字元(char):此類變數可儲存經由 ASCII 碼轉換的單一英文字母(如 ‘A’、’B’…等),轉換表如附錄 A 所示。其實所儲存內容是正整數,也可經由運算得到另一個字元的 ASCII 碼。
(D) 字串(String):此類型變數可以存放經由字碼轉換的一連串中英文文字(如:" Good Luck To You " 或 "大家恭喜"),英文係利用 ASCII 碼表示,正體中文大多採用 big-5 碼轉換(各系統也許不同)。
(E) 布林代數(boolean):此類型變數僅能儲存『真』(True, 1)或『假』(false, 0),大多使用於邏輯運算,或條件判斷式使用。
我們可利用 Java 某些關鍵字,來宣告產生變數。宣告變數的關鍵字與資料型態名稱相同,如表 2-1 所示(byte、short、int、float、String…等)。基本上,變數名稱是不受限制的,但還是有下列重點:
儘量採用有意義的名稱,如 data、selection、cost 等等。
不可以有特殊符號,如 +、-、*、$、#、@、! 等等。
不限長短,但有分辨大小寫字母。
不可使用 Java 保留字(或稱關鍵字)。
變數宣告語法如下:
1 |
int a; |
宣告產生一個整數變數,其名稱為 a。 |
2 |
int a, b; |
宣告產生兩個整數變數 a 與 b。 |
3 |
int count = 10; |
宣告整數變數 count,並給予初值 10。 |
4 |
short sum; |
宣告一個短整數,名稱為sum。 |
5 |
long total=0; |
宣告一個長整數變數 total,並設定初值 0。 |
6 |
float price; |
宣告一個浮點數變數 price。 |
7 |
double price; |
宣告一個雙倍浮點數 price。 |
8 |
char key ='A' ; |
宣告一個字元變數 key,並給予初值 'A'。 |
9 |
String name = "您好"; |
宣告字串變數 name,內容為 "您好"。 |
10 |
boolean flag = TRUE; |
宣告布林變數 flag,並給以『真』(True,1)。 |
11 |
boolean flag = FALSE; |
宣告布林變數 flag,並給以『假』(False,0) |
表 2-2 為 Java 保留字彙集,每一個保留字都有其特殊用途(爾後會陸續介紹到其功能),不可以作為變數名稱。
表 2-2 Java 保留字彙集
abstract |
double |
int |
strictfp |
Do |
boolean |
else |
interface |
super |
while |
break |
extends |
long |
switch |
volatile |
byte |
final |
native |
synchronized |
short |
case |
finally |
new |
this |
static |
catch |
float |
package |
throw |
import |
char |
for |
private |
throws |
instanceof |
class |
goto |
protected |
transient |
default |
const |
if |
public |
try |
|
continue |
implements |
return |
|
|
(A)程式功能:Ex2_1.java
列印出各種資料型態的數值,並說明變數的功能為何;輸出格式如下:
我是短整數 short count=10 ,可當作計數器 我是整數 int number =20 ,可當整數運算 我是長整數 long value=300 ,可存放較大的整數 我是浮點 float cost=40.2 ,可表存放有小數點數值 我是雙倍浮點 double weight=500.34 ,可存較精密的數值 我是字元 char key=A ,可做字元比較或測試 我是布林 boolean flag=true ,可做事件發生的旗標 我是字串 String name=Tien-Shou Nien ,可當文字串列使用 |
(B)程式範例:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class Ex2_1 { public static void main(String[] args) { short count=10; System.out.println("我是短整數 short count="+count+" ,可當作計數器"); int number=20; System.out.println("我是整數 int number ="+number+" ,可當整數運算"); long value=300; System.out.println("我是長整數 long value="+value+" ,可存放較大的整數"); float cost=40.2F; System.out.println("我是浮點 float cost="+cost+" ,可表存放有小數點數值"); double weight=500.34; System.out.println("我是雙倍浮點 double weight="+weight+" ,可存較精密的數值"); char key='A'; System.out.println("我是字元 char key="+key+" ,可做字元比較或測試"); boolean flag=true; System.out.println("我是布林 boolean flag="+flag+" ,可做事件發生的旗標"); String name="Tien-Shou Nien"; System.out.println("我是字串 String name="+name+" ,可當文字串列使用"); } } |
(C)程式重點說明:
第 5 行:『short count=10;』。宣告一個名稱為 count 的短整數,並給予初值 10。
第 6 行:『System.out.println("我是短…. "+count+" ,可當作計…. ");』。功能是首先印出一串文字(我是短整數…),再接著印出 count 變數的內容,最後接著印出下一段文字(, 可當作計….)。
第 15 行:『float cost=40.2F;』。宣告一個浮點變數 cost,並給予初值 40.2F,後面必須增加一個『F』表示浮點數的意思,否則會被認為是雙倍浮點數。
第 21 行:『char key='A';』。宣告一個字元變數 key,並給予初值 A,數值僅能一個字元,而且必須用單引號('A')包起來。
第 24 行:『boolean flag=true;』。宣告一個布林變數 flag,並將其設定為『真』(true, 1)。如設定為『否』,則 flag=false;但許多情況是利用 1 與 0 來表示真或否。