460 likes | 660 Views
網路程式設計 第二章:程式語言概念. 開南資管 鄧姚文 http://w3.im.knu.edu.tw ywdeng@mail.knu.edu.tw. 大綱. 程式的符號 變數的設定 資料型別 運算符號 Java 的物件概念. 程式的符號. 程式只是一堆文字、數字、標記組合而成的檔案 程式中的文字組成包含了特定的原則 語法 (Syntax) 依照正確語法排列而成的文字才能被 Java 的編譯器接受。 各種程式語言定義的語法並不相同,一般而言,程式語言都會包含以下的組成元件:「識別字」、「關鍵字」或「保留字」、「資料常數」、「符號」等。.
E N D
網路程式設計第二章:程式語言概念 開南資管 鄧姚文 http://w3.im.knu.edu.tw ywdeng@mail.knu.edu.tw
大綱 • 程式的符號 • 變數的設定 • 資料型別 • 運算符號 • Java 的物件概念
程式的符號 • 程式只是一堆文字、數字、標記組合而成的檔案 • 程式中的文字組成包含了特定的原則 • 語法 (Syntax) • 依照正確語法排列而成的文字才能被 Java 的編譯器接受。 • 各種程式語言定義的語法並不相同,一般而言,程式語言都會包含以下的組成元件:「識別字」、「關鍵字」或「保留字」、「資料常數」、「符號」等。
識別字(Identifiers) • 識別字是指變數(Variable)、方法(Method)、類別(Class)的名稱 • 識別字命名的原則有 • 由中英文字母、阿拉伯數字、$、_ 組成 • 第一個字不可以是阿拉伯數字 • 識別字中不能有標點符號、空白、運算符號 • Java 的關鍵字不可以當作識別字 • 英文字母大小寫視為相異 • 反例 • 3Q • student-name
註解(Comment) // 單行註解 /* 多行 註解 */
資料常數 (Literals) • 不會再更改的資料內容
符號 (Symbol Identifiers) • 程式中的符號多半是運算符號。 • 例如:+、-、*、/、=...。 • 也可能是分隔符號。 • 例如「小括號 ( )」、「大括號{ }」、「分號 ( ; )」、「句號 ( . )」。
變數(Variables) • 在記憶體中保留特定大小的空間,讓程式執行時可以暫時儲存資料 • 必需先經過宣告,語法如下: • type name [= value] [, name [=value]...]; • 「type」是資料的型別, • 「name」是變數的名稱, • 可以使用「=」指定變數的初始值。 • 可以在指定型別後,同時宣告多個變數的內容,例如: • int days, months, years; //同時宣告三個整數變數 • int total; //只宣告一個整數變數 • int salary = 200, age=15; //宣告整數變數並指定初始值
變數範圍(Variables Scope) • 在區塊內宣告的變數,其有效範圍僅限區塊內 public class Door { String color; // OK public String paintColor(String s) { String color; // NOT OK double size; } public double getSize() { return size; // compile time error } }
區塊(Block) • 程式區塊以 { 開始,以 } 結束 public class Door { String color = “red”; double width = 200.0; double height = 75.0; public double getArea() { double area = height * width; return area; } }
指定(Assignment) x = 123; y = x + 321; y = y + 1; a = b = 100; • 將等號右邊的值,指定給等號左邊的變數 • 每一個敘述都必須以分號(;)結尾
資料型別 • Java程式是屬於「強型別 (strongly typed language) 」程式語言。 • 雖然 Java 也提供自動轉換資料型別的功能,但並不是所有的資料型別都可以自由地互相轉換。 • Java的資料型別可以概分為兩大類: • Primitive Data Type:基本資料型別 • 純數值,不是物件 • Reference Data Type:參考資料型別 • 結構複雜物件 • Java 定義了八個 Primitive Types,分為四大類,除了這八個資料型別外,其餘都屬於「參考資料型別」。
基本資料型別(Primitive Data Types) • 數字 • 整數(Integer) • 浮點數(Floating Point Numbers) • 文字 • 字元(Character) • 布林(Boolean)
整數(Integer) • 預設型別:數字如果沒有小數點便是 int int i = 1234; // decimal 十進位 int j = 01234; // octal(664) 八進位 int k = 0xFF; // hexdecimal(255) 十六進位 long m = 13L; // 長整數 long n = 13; // 整數轉成長整數 int a = 13; byte b = a; // compile time error byte c = (byte)a; // OK
浮點數(Floating Point Number) • 預設型別:數字如果有小數點便是 double double p = 789.123; double q = 7.89123e+2; // 7.89123X102 double r = 789123e-3; // 0.789123X10-3 float x = 3.14F; float y = x + (float) p;
字元(Character) • 一個字 • Unicode char ans = 'A'; char code = 65; // 'A' 的 Unicode 碼是 65 char sn = '鄧'; char a = 'あ';
字元(Character) • 對於一些非ASCII字元集或是無法由鍵盤輸入的符號,可以使用16進位碼表示,格式為「/uHHHH」,「H」是16進位碼。例: • char x = '\u5496'; • 跳脫字元 (Escape Character)
布林(Boolean) • 布林變數只能儲存「true」或「false」,用來判斷儲存的資料內容為「真(成立) 」或「假 (不成立) 」。 • 不能在布林變數中儲存 0、1 或其他數值。 • 布林變數的預設值是「false」。 • 例: boolean done = false; done = (n > 100);
資料型別轉換(Casting) • 相同型別的物件之間才可以進行運算 • 三根香蕉+四顆硬碟 = ? • 自動型別轉換 • 自動將較小(簡單)的型別轉換成較大(複雜)的型別 • 相容的型別之間可以自動轉換
資料型別轉換(Casting) • 顯式型別轉換(Explicit Casting) • 強迫變小、變簡單 • 可能造成資訊遺失 --- 結果自行負責! • 例: int amount, salary = 12000; double tax = 0.6; amount = salary * 12 * tax; // 編譯時錯誤! • 更正成: amount = (int) (salary * 12 * tax); // OK
溢位 (Overflow) 處理 • Java 程式在執行時,並沒有溢位的問題。 • 當計算式中的數值超過資料型別所能容納的範圍後,數字會產生「轉折」的現象,我們稱之為「Modular」。 • 以「byte」型別為例,我們利用下圖來解釋「Modular」的現象:
常數 (Constants) 的宣告 • 常數:內容不改變 • 宣告的語法如下: final type NAME [= value]; • 以下的常數使用方式是合法的: final int HOURS = 24; //宣告時指定常數的內容 • 或者,我們也可以這樣的使用: final int HOURS; //宣告一個常數 HOURS = 24; //第一次指定內容
運算符號 • 運算式是由「運算子 (Operator)」和「運算元 (Operand)」組合而成的。 • 運算元代表資料 • 運算子決定資料的運算方式,又稱為「運算符號」。 • 例如:以下的表示式中: x = y + z; 「x」、「y」、「z」是運算元,「+」、「=」是運算子 • 分類: • 「算術運算子」、「指定運算子」、「關係運算子」、「邏輯運算子」、「字串運算子」
算術運算子 • 加法:+ • 減法:- • 乘法:* • 除法:/ • 整數的除法沒有小數,也不留餘數 • 取餘數:% • 限用於整數 5 / 2 = 2 5 % 2 = 1
「++」和「--」運算子 • ++ 加一 • -- 減一 • x++ 等同於 x = x + 1; • 運算子置於變數之前或變數之後,對於變數本身的內容改變的時間並不相同 • 「++」或「--」放於變數之後,在整行運算式執行完成後,變數本身的值才會增加1。 • 「++」或「--」放於變數之前,變數本身的值先增加1,再執行運算式 a = 100; b = a++; // b is 100, a is 101 c = ++a; // c is 102, a is 102
結合指定運算 int x = 1; int y = 2; x += 3; //相當於 x = x + 3 y -= x; //相當於 y = y - x x *= 2; //相當於 x = x * 2 y /= 6; //相當於 y = y / 6 x %= 4; //相當於 x = x % 4 z >>>= 1; //相當於 z = z >>> 1
x y 0 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 位元平移運算子 • y = x << 1; // 相當於 y = x * 2 • MSB 捨去,最右邊插入一個 0 • z = x >> 1; // 相當於 z = x / 2 ? • 保險起見,使用 z = x >>> 1
關係運算子 • 運算結果不是 true 就是 false • 大於:> • 小於:< • 相等:== • 大於等於:>= • 小於等於:<= • 不等於:!=
邏輯運算子 • 紀錄某件事情是『真』還是『假』
字串(String) • 字串是物件 • Instances of java.lang.String String s1 = new String("Hello "); String s2 = "Baby"; String s3 = s1 + s2; // s3 is "Hello Baby"
Java的物件概念 • 物件變數的宣告僅只是配置了存取物件的「參考 (reference)」,並未配置該物件的實際儲存空間 • 物件必需「實體化」後才會有記憶體空間 。 • 物件具有屬性和方法 • 屬性:資料 • 方法:動作、副程式 • 物件有生命週期,物件不再使用時,所佔的系統資源必需回收 • Java 不允許程式直接操作記憶體,JVM 代為管理記憶體 • Garbage Collection:JVM 回收不再被使用的物件
Wrapper Class • Primitive 型別的資料並不是物件 • Wrapper Class 將基本資料型別轉換成物件
Integer類別 • Integer 類別對應 int • 例: int i = 123; //宣告一個int變數並指定值 //宣告一個Integer物件並指定值 Integer i = new Integer(123); //宣告一個Integer物件並指定值 Integer i = new Integer("123");
同一個物件(位址相同) Object a; Object b; … a == b ? 內容相同 Student a, b; … a.setName(“John”); b.setName(“John”); a.equals(b)? 同一個物件?同一個位址?內容相同?
練習 • 輸出下列變數的計算結果 Integer a = new Integer(10); Integer b = new Integer(10); Integer c = a; boolean same1 = (a == b); boolean same2 = (b == c); boolean same3 = (c == a); boolean same4 = c.equals(b);
Wrapper Class 比大小 • 使用「equals」比較兩個 Wrapper Class 物件所存放的數值是否相同 • 使用「compareTo」比較兩個 Wrapper Class 物件所存放的數值大小 • compareTo 傳回一個整數 • 等於 0,兩個物件存放的數值相等。 • > 0,呼叫此方法的物件值大於傳入該方法的物件值 • < 0,呼叫此方法的物件值小於傳入該方法的物件值
Boolean類別 • Boolean類別對應到 boolean 這個基本資料型態。 • 建構Boolean物件時,可以傳入一個boolean值或是傳入一個字串。如果傳入的字串是「true」,不論大小寫,Boolean物件存放的值都是「true」,如果傳入其他的字串物件存放的值都是「false」。 • 參考以下的程式碼: • boolean b; • b = new Boolean(true); //b為true • b = new Boolean(false); //b為false • b = new Boolean("True"); //b為true • b = new Boolean("Qoo"); //b為false
Byte類別 • Byte類別對應到 byte 這個基本資料型態。 • 建構Byte物件時,可以傳入一個 byte 值或傳入一個字串。如果傳入字串的格式不符合byte 格式時,程式執行時會產生NumberFormatException例外物件。 • Byte類別中常用到的方法有
Boxing與AutoBoxing-J2SE 5.0 • 將 Primitive 資料轉換為相對應的 Wrapper 物件稱為「Boxing」;轉換時,必需自行建構 Wrapper 物件。 • 將 Wrapper 物件轉換為相對應的 Primitive 資料稱為「UnBoxing」,必需指定相關的方法傳回值。 • 在J2SE 5.0新增了「AutoBoxing」的功能,由 Complier 在「Boxing」時自動的產生 Wrapper 物件或是在「UnBoxing」時自動取出 Wrapper物件中的值。例如: int p = 600; //沒有使用AutoBoxing,要自行建構Wrapper物件 Integer v1 = new Integer(p); //使用AutoBoxing,由Compiler自動產生Wrapper物件 Integer v2 = p; //沒有使用AutoBoxing,使用intValue方法取得值 int p2 = v1.intValue(); int p3 = v1; //使用AutoBoxing,由Compiler自動取出值