1、變數、資料型態與運算子 3-1 變數與資料型態的基礎 3-2 變數的命名與宣告 3-3 Java的資料型態 3-4 Java的運算式 3-5 資料型態的轉換33-1 變數與資料型態的基礎-圖例 在程式語言的變數(Variables)可以視為是一個擁有名稱的盒子,能夠在程式執行時暫時儲存所需的資料,如下圖所示:3-1 變數與資料型態的基礎-圖例說明 方形和圓柱形的兩個盒子名稱分別是變數名稱grade和height,在盒子中儲存的資料85和175.5稱為字面值(Literals)或稱為常數值(Constants),也就是數值、字元或字串等常數值,如下所示:10015.3Java程式 現在回到盒子本
2、身,盒子形狀和尺寸決定儲存資料,對比程式語言來說,形狀和尺寸就是變數的資料型態(Data Types)。3-2 變數的命名與宣告 3-2-1 Java的命名語法 3-2-2 變數的宣告 3-2-3 指定敘述 3-2-4 常數的宣告與使用3-2 變數的命名與宣告 電腦程式是由資料(Data)和指令(Instructions)組成。資料部分是指本章的變數(Variables)和資料型態(Data Types)。指令部分是本章的運算子、第4章的流程控制(Control Structures)和第5章的程序(Subroutines)。3-2-1 Java的命名語法-說明 在Java程式碼中的關鍵字(K
3、eywords),或稱保留字(Reserved Word)是一些對於編譯程式而言,擁有特殊意義的名稱,其他非關鍵子的名稱都是程式設計者自訂的元素名稱,稱為識別字(Identifier),例如:變數、程序、函數和物件名稱等。3-2-1 Java的命名語法-命名規則 名稱是一個合法的識別字(Identifier),識別字是使用英文字母、底線_或錢號$開頭,不限長度的Unicode統一字碼字元的字串,包含字母、數字、錢號$和底線_。例如:一些合法的名稱範例,如下所示:T,n,size,z100,long_name,helloWord,Test,apple,$total,_orderInput_str
4、ing,x,TITLE,APPLE,subtotal,_getTotal,$_32_cpu 名稱最長為255個字元,而且名稱區分英文字母的大小寫,例如:apple、Apple和APPLE是不同的名稱。名稱不能使用Java語法的關鍵字(Keyword)。名稱在範圍(Scope)中必需是唯一的,例如:在程式中可以使用相同的變數名稱,不過各變數名稱需要在不同的範圍。3-2-1 Java的命名語法-慣用的命名法 讀者如果想維持程式碼的可讀和一致性,Java識別字的命名可以使用一些慣用的命名原則。例如:CamelCasing命名法是第1個英文字小寫之後為大寫,變數、函數的命名可以使用不同英文字母大小寫的
5、組合,如下表所示:識別字種類識別字種類習慣的命名原則習慣的命名原則範例範例常數使用英文大寫字母和底線_符號MAX_SIZE、PI變數使用英文小寫字母開頭,如果是2個英文字組成,第2個之後的英文字以大寫開頭size、userName函數使用英文小寫字母開頭,如果是2個英文字組成,其他英文字使用大寫開頭pressButton、scrollScreen3-2-2 變數的宣告-說明 變數可以儲存程式執行中的一些暫存資料,程式設計者只需記住變數名稱,並且知道名稱表示一個記憶體位置中的資料即可。至於記憶體位置到底有那裡?並不用傷腦筋,因為是編譯程式的工作。簡單的說,程式語言的變數是使用有意義的名稱,代表數
6、字的記憶體位址。3-2-2 變數的宣告-屬性屬性名稱屬性名稱說明說明名稱(Name)變數名稱是一個標籤,用來在程式中識別出它是一個變數位址(Address)在記憶體中儲存此變數的記憶體位址尺寸(Size)變數所佔用的記憶體大小,以位元組為單位型態(Type)變數儲存資料的資料型態值(Value)變數值,也就是在記憶體位址中儲存的資料壽命(Lifetime)在執行程式時,變數存在的期間,有些變數是在整個執行過程中都存在;有些變數是在執行期間自動或由程式碼建立範圍(Scope)在程式碼的哪些程式敘述可以存取此變數3-2-2 變數的宣告-變數宣告 Java的變數宣告是使用資料型態開頭,後面接著變數名
7、稱,如下所示:int grade;上述程式碼宣告整數變數grade,它是使用int資料型態開頭,後面跟著變數名稱grade。如果需要多個相同資料型態的變數時,我們可以在同一列程式碼宣告多個相同資料型態的變數,各變數使用,逗號分隔,如下所示:int i,j,total;3-2-2 變數的宣告-變數的初始值 變數宣告單純只是配置記憶體空間,並沒有指定變數值。如果需要指定變數值,我們可以在宣告同時指定變數的初始值,或使用第3-2-3節的指定敘述來設定變數值。Java語言宣告變數且指定變數初值,如下所示:int grade=95;int i=20;3-2-3 指定敘述-說明 指定敘述(Assignme
8、nt Statement)可以在程式碼中存取變數值,如果在宣告變數時沒有指定變數值,我們就可以使用指定敘述,即=等號來指定或更改變數值,如下所示:mathGrade=85;englishGrade=67;上述指定敘述的等號左邊是變數名稱,右邊是運算式(Expressions),以此例是將右邊的值指定給左邊的變數。3-2-3 指定敘述-記憶體圖例 在指定敘述=等號左邊的變數稱為左值(Lvalue),表示變數的位址(Address)屬性;等號的右邊稱為右值(Rvalue),此為變數的值(Value)屬性。變數的記憶體圖例(位址是假設值),如下圖所示:3-2-3 指定敘述-指定成變數 如果指定敘述的
9、右邊是變數,在等號左邊的變數englishGrade是左值,取得位址;右邊變數mathGrade是右值,取出變數值。如下所示:englishGrade=mathGrade;換句話說,指定敘述是d將變數mathGrade的值85存入變數englishGrade的記憶體位址,即1004,也就是更改變數englishGrade的值成為變數mathGrade的值85。3-2-4 常數的宣告與使用 常數(Named Constants)是指一個變數在設定初始值後,就不會變更其值。簡單的說,就是在程式中使用一個名稱代表一個固定值。Java語言的常數宣告和指定初值的變數宣告相同,只是在前面使用final關鍵
10、字表示變數值不能更改,如下所示:final double PI=3.1415926;上述程式碼宣告圓周率的常數PI。請注意!在宣告常數時一定要指定常數值。3-3 Java的資料型態 3-3-1 整數資料型態 3-3-2 浮點數資料型態 3-3-3 布林資料型態 3-3-4 字元資料型態3-3 Java的資料型態-種類 基本資料型態:變數共有byte、short、int、long、float、double、char和boolean八種資料型態,在本節將說明Java的基本資料型態。參考資料型態:變數值是一個記憶體位置,此位置值是物件儲存的位置,例如:String字串、陣列和物件。3-3-1 整數資
11、料型態-種類 整數資料型態(Integral Types)是指變數資料為整數沒有小數點。依整數資料長度不同(即佔用的記憶體位元數),可以分為四種整數資料型態,如下表所示:整數資料型態整數資料型態位元數位元數範圍範圍byte8-27 27-1,即-128 127short16-215 215-1,即-32768 32767int32-231 231-1,即-2147483648 2147483647long64-263 263-1,即-9223372036854775808 92233720368547758073-3-1 整數資料型態-整數字面值 在Java程式碼可以直接使用包含0、正整數和負
12、整數的整數字面值(Integral Literal),它可以使用十進位、八進位和十六進位表示,如下所示:八進位:0開頭的整數值,每個位數值為07的整數。十六進位:0 x開頭的數值,位數值為09和AF(或af)。3-3-1 整數資料型態-字尾型態字元 整數字面值的資料型態視數值的範圍而定,Java語言可以使用數值字尾型態的字元將字面值指定成long長整數,如下表所示:資料型態資料型態字元字元範例範例longL/l245l或245L3-3-2 浮點數資料型態-種類 浮點數資料型態(Floating Point Types)是指整數加上小數,例如:3.1415926、12300.56789等。依長度
13、不同(即佔用的記憶體位元數),可以分為兩種點數的資料型態,如下表所示:浮點數資料型態浮點數資料型態位元數位元數範圍範圍float321.40239846e-45 3.40282347e38double644.94065645841246544e-324 1.79769313486231570e3083-3-2 浮點數資料型態-浮點數字面值 在Java程式碼如果直接使用浮點數字面值(Floating Point Literal),其預設是double資料型態,而不是float。我們也可以使用科學符號的e或E符號來代表10為底的指數。一些浮點數字面值的範例,如下表所示:浮點數字面值浮點數字面值十進
14、位值十進位值說明說明0.01230.0123浮點數.00567.00567浮點數1.25e412500.0使用e指數科學符號的浮點數3-3-2 浮點數資料型態-字尾型態字元 如果浮點變數宣告的是float,在指定浮點數字面值時,因為預設是double,所以需要在浮點數字面值的字尾加上字元F或f,將數值轉換成浮點數float,如下所示:float i=25.0F;float資料型態是使用的字尾F。浮點數字面值的字尾型態字元,如下表所示:資料型態資料型態字元字元範例範例floatF/f6.7F或6.7fdoubleD/d3.1415D或3.1415d3-3-2 浮點數資料型態-使用底線符號 Jav
15、a SE 7版的數值字面值可以使用底線_,換句話說,在數值各位數之間可以加上_符號來增加數值的可讀性,如下所示:long credit_card_number=1234_5678_9012_3456L;float pi=3.14_15F;long hexBytes=0 x00_EC_FF_5E;long bytes=0b11010010_01101001;3-3-3 布林資料型態 布林資料型態(Boolean Type)只能有2個值true和false,這並不是變數名稱,而是Java關鍵字,布林變數主要是使用在邏輯運算式,如下所示:boolean isRateHigh;isRateHight=
16、(rate=.02);上述運算式的值是布林資料型態,比較利率是否大於等於.02,通常是使用在第4章條件和迴圈控制的條件判斷,以便決定繼續執行哪一個程式區塊的程式碼,或判斷迴圈是否結束。3-3-4 字元資料型態-說明 字元資料型態(Char Type)是無符號(Unsigned)的16位元整數表示的Unicode字元。Unicode使用2個位元組來表示字元,可以取代ASCII字元單一位元組的表示方式。3-3-4 字元資料型態-字元字面值 在Java程式使用字元字面值(Char Literal)時,需要使用單引號括起,如下所示:char a=A;上述變數宣告設定初值為字元A,請注意!字元字面值是使
17、用單引號,而不是雙引號括起。Unicode字元需要使用u字串開頭的十六進位數值來表示,如下所示:char c=u0020;上述字元字面值是一個空白字元(Space)。3-3-4 字元資料型態-字串字面值 字串字面值(String Literals)就是一個字串,字串是0或多個依序的字元字面值使用雙引號括起的文字內容,如下所示:“Java程式設計”“Hello World!”在Java語言的字串是一種字串物件,屬於參考資料型態,目前Java程式碼的字串主要是使用在System.out.println()或println()方法的參數,如下所示:System.out.print(換行符號n);3-
18、3-4 字元資料型態-Escape逸出字元 Java語言提供Escape逸出字元,這是使用符號開頭的字串,可以顯示一些無法使用鍵盤輸入的特殊字元,如下表所示:Escape逸出字元逸出字元Unicode碼碼說明說明bu0008Backspace,Backspace鍵fu000CFF,Form feed換頁符號nu000ALF,Line feed換行符號ru000DCR,Enter鍵tu0009Tab鍵,定位符號u0027單引號u0022雙引號u005C符號 3-4-1 運算子的優先順序 3-4-2 算術運算子 3-4-3 遞增和遞減運算 3-4-4 關係與條件運算子 3-4-5 位元運算子 3-
19、4-6 指定運算子3-4 Java的運算式3-4 Java的運算式 在Java指定敘述的左邊是一個運算式(Expressions),它是由運算子(Operator)和運算元(Operand)所組成,Java提供完整的算術、指定、位元和邏輯運算子。一些運算式的範例,如下所示:a+b 1a=ba b&a 1 運算式變數a、b和數值1都屬於運算元,+、-、=、和&為運算子,Java運算子是使用1到3個字元所組成的符號。3-4-1 運算子的優先順序-說明 因為Java支援多種運算子,當同一個運算式使用多種運算子時,為了讓運算式能夠得到相同的運算結果,運算式是以運算子預設的優先順序來進行運算,也就是我們
20、熟知的先乘除後加減,如下所示:c+d*2 運算式在先計算d*2後才和c相加,這就是因為運算子優先順序*大於+。3-4-1 運算子的優先順序運算子運算子說明說明()括號!、-、+、-條件運算子 NOT、算數運算子負號、遞增和遞減*、/、%算術運算子的乘、除法和餘數+、-算術運算子加和減法、位元運算子左移、右移和無符號右移、=、=關係運算子大於、大於等於、小於和小於等於=、!=關係運算子等於和不等於&位元運算子 AND位元運算子 XOR|位元運算子 OR&條件運算子 AND|條件運算子 OR?:條件控制運算子=、op=指定運算子3-4-2 算術運算子-說明與範例 Java的算術運算子(Arithm
21、etic Operators)就是常用的數學運算子,其運算元是數值的變數或字面值,其中加法運算子可以用來連接2個字串。算術運算子的說明與範例,如下表所示:運算子運算子說明說明運算式範例運算式範例-負號-7*乘法5*6=30/除法7.0/2.0=3.5、7/2=3%餘數7%2=1+加法4+3=7-減法4 3=13-4-2 算術運算子-建立數學公式 在Java程式碼只需使用算術運算子、變數和字面值,就可以建立複雜的數學運算式,如下所示:f=x*x-2*x+3;f=(x+y)*(x+y)+5;數學運算式的x和y是變數,只需指定x和y的值,就可以計算運算式的值。如果擁有現成數學公式,例如:華氏(Fah
22、renheit)和攝氏(Celsius)溫度轉換的公式。攝氏轉華氏的公式,如下所示:f=(9.0*c)/5.0+32.0;華氏轉攝氏的公式,如下所示:c=(5.0/9.0)*(f-32);3-4-2 算術運算子-字串連接運算子 Java的+運算子對於數值資料型態來說,是加法,可以計算兩個運算元的總和。如果運算元的其中之一或兩者都是字串時,+運算子就是字串連接運算子,可以連接多個字串變數,如下所示:ab+cd=abcdJava程式+設計=Java程式設計3-4-3 遞增和遞減運算-說明運算子運算子說明說明運算式範例運算式範例+遞增運算x+、+xx-遞減運算y-、-y Java語言的遞增和遞減運算
23、字(Shortcut Increment and Decrement Operators)是一種置於變數之前或之後的運算式簡化寫法,如下表所示:3-4-3 遞增和遞減運算-範例 例如:x=x+1和y=y-1運算式相當於是:x+;或+x;y-;或-y;遞增和遞減運算子使用在算術或指定運算式中,如果在前面,變數值立刻改變,如果在後面,表示在執行運算式後才會改變,如下所示:x=10;y=10;System.out.println(x+=+x+:x=+x);System.out.println(-y=+-y+:y=+y);第1個x+值仍然為10,第2個x為11。最後1列-y的運算子是在前,所以第1個為
24、9,第2個也是9。3-4-4 關係與條件運算子-關係運算子 關係運算子(Relational Operators)是使用在迴圈和條件敘述的判斷條件,可以比較2個運算元間的關係,例如:=為true表示運算元相等。關係運算子的說明與範例,如下表所示:運算子運算子說明說明運算式範例運算式範例結果結果=等於7=5false!=不等於7!=5true小於7 大於7 5true=小於等於7=大於等於7=5true3-4-4 關係與條件運算子-條件運算子運算子運算子範例範例說明說明!opNOT 運算,傳回運算元相反的值,true 成 false,false成 true&op1&op2 AND 運算,連結的
25、2 個運算元都為 true,運算式為 true|op1|op2OR 運算,連結的 2 個運算元,任一個為 ture,運算式為 true&op1&op2如果 op1 和 op2 為布林資料型態的變數,此時的運算子如同&,如果運算元為數字就是下一節的位元運算|op1|op2如果 op1 和 op2 為布林資料型態的變數,此時的運算子如同|,如果運算元為數字就是下一節的位元運算op1 op2XOR運算,連結的2個運算元,只需任一個為true,結果為 true,如果同為 false 或 true 時結果為 false3-4-5 位元運算子-說明運算子運算子範例範例說明說明op1位元的 NOT 運算,運
26、算元的位元值 1 時為 0,0 為 1&op1&op2位元的 AND 運算,2 個運算元的位元值相同是 1 時為1,如果有一個為 0,就是 0|op1|op2位元的 OR 運算,2 個運算元的位元值只需有一個是 1,就是 1,否則為 0op1 op2位元的 XOR 運算,2 個運算元的位元值只需任一個為1,結果為 1,如果同為 0 或 1 時結果為 0 Java的位元運算子(Shift and Bitwise Operators)能夠進行整數二進位值的位元運算,提供向左移或右移幾個位元的位移運算或NOT、AND、XOR和OR的位元運算,如下表所示:3-4-5 位元運算子-真假值表 位元運算子結
27、果(a和b代表二進位中的一個位元)的真假值表,如下表所示:abNOT aNOT ba AND ba OR ba XOR b11001101001011011001100110003-4-5 位元運算子-AND運算 AND運算&通常是用來將整數值的一些位元遮掉,也就是說,當使用位元遮罩(Mask)和數值進行AND運算後,可以將不需要的位元清成0,只取出所需的位元。例如:位元遮罩0 x0f值可以取得char資料型態值中,低階4位元的值,如下所示:3-4-5 位元運算子-OR運算 OR運算|可以將指定的位元設為1。例如:OR運算式60|3,如下所示:3-4-5 位元運算子-XOR運算 XOR運算是當
28、比較的位元值不同時,即0和1,或1和0時,將位元設為1。例如:XOR運算式60 120,如下所示:3-4-5 位元運算子-位移運算(說明)Java語言提供向左移(Left-shift)、右移(Right-shift)和無浮號右移(Unsigned Right-shift)幾種位移運算,如下表所示:運算子運算子範例範例說明說明op1 op1 op2右移運算,op1 往右位移 op2 位元,最左邊補入 op1最高位元值,正整數補 0,負整數補 1op1 op2 無符號右移運算,op1 往右位移 op2 位元,然後在最左邊補 03-4-5 位元運算子-位移運算(範例)對於正整數來說,左移運算每移1個
29、位元,相當於乘以2;右移運算每移1個位元,相當於是除以2。例如:原始十進位值3的左移運算,在最右邊補0,如下所示:00000011 1=00000110(6)00000011 1=00111100(60)01111000 2=00011110(30)3-4-6 指定運算子運算子運算子範例範例相當的運算式相當的運算式說明說明=x=yN/A指定敘述+=x+=yx=x+y數字相加或字串連結-=x-=yx=x-y減法*=x*=yx=x*y乘法/=x/=yx=x/y除法%=x%=yx=x%y餘數=x=yx=x=x=yx=x y位元右移 y 位元=x=yx=x y無符號右移 y 位元&=x&=yx=x&y
30、位元 AND 運算|=x|=yx=x|y位元 OR 運算=x=yx=x y位元 XOR 運算3-5 資料型態的轉換 3-5-1 寬基本型態轉換 3-5-2 窄基本型態轉換與型態轉換運算子3-5 資料型態的轉換 指定敘述型態轉換(Assignment Conversion)在Java程式中會經常的出現,例如:將整數轉換成浮點數。資料型態轉換是指轉換變數儲存的資料,而不是變數本身的資料型態。指定敘述型態轉換以基本資料型態來說,可以分為兩種:寬基本型態轉換(Widening Primitive Conversions)和窄基本型態轉換(Narrowing Primitive Conversions)
31、。3-5-1 寬基本型態轉換-說明 在指定敘述型態轉換的寬基本型態轉換並不需要特別語法,運算式如果擁有不同型態的運算元,就自動轉換成相同的資料型態,因為轉換成範圍比較大的型態,並不會損失精確度,如下所示:double float long int char short byte 型態的優先順序是指如果2個運算元屬於不同型態,就會自動轉換成優先順序比較高的型態。3-5-1 寬基本型態轉換-範例運算元運算元 1運算元運算元 2轉換成轉換成doublefloatdoublefloatintfloatlongintlong3-5-2 窄基本型態轉換與型態轉換運算子-說明 窄基本型態轉換就是從精確度比較
32、高的資料型態轉換成較低的資料型態,例如:double轉換成float,long轉換成int,所以變數儲存的資料將會損失一些精確度。3-5-2 窄基本型態轉換與型態轉換運算子-強迫轉換資料型態 指定敘述型態轉換的窄基本型態轉換通常並不會自動處理,而是需要使用Java的型態轉換運算子(Cast Operator)在運算式中強迫轉換資料型態,如下所示:r1=(float)a;r2=(float)(a+b);程式碼可以將運算式或變數強迫轉換成前面括號的型態,以此例是轉換成float浮點數資料型態。一般來說,我們使用型態轉換運算子,通常都是因為轉換結果並非預期結果。3-5-2 窄基本型態轉換與型態轉換運算子-強迫轉換範例 例如:整數和整數的除法27/5,其結果是整數5。如果需要精確到小數點,就不能使用指定敘述型態轉換,而需要先將它強迫將它轉換成浮點數,例如:a=27、b=5,如下所示:r=(float)a/(float)b;程式碼將整數變數a和b都強迫轉換成浮點數float,此時27/5的結果是5.4。