470 likes | 974 Views
JAVA 基本語法. 鄧姚文 http://www.ywdeng.idv.tw joseph.deng@gmail.com. 內容大綱. Java 語言簡介 Java 程式基礎 一個簡單範例: Hello Java ! Java 程式基本結構 資料型態與變數 運算子與運算式 流程控制 編譯與執行 Java 程式 使用執行時期參數的 Hello Java !. Java 語言簡介: Java 的版本. JAVA SE ( Java Platform, Standard Edition )
E N D
JAVA 基本語法 鄧姚文 http://www.ywdeng.idv.tw joseph.deng@gmail.com
內容大綱 • Java 語言簡介 • Java 程式基礎 • 一個簡單範例:Hello Java ! • Java 程式基本結構 • 資料型態與變數 • 運算子與運算式 • 流程控制 • 編譯與執行 Java 程式 • 使用執行時期參數的 Hello Java !
Java 語言簡介:Java 的版本 • JAVA SE(Java Platform, Standard Edition) • 桌面應用程式、GUI、資料庫、網路、… • JAVA EE(Java Platform, Enterprise Edition) • N-Tier Applications、Web Applications、… • JAVA ME(Java Platform, Micro Edition) • PDA、手機、Smart Card、…
Java Platform Edition 摘自http://thisjava.blogsome.com/2005/03/28/java-technology/
Java 程式基礎 一個簡單範例:Hello Java ! Java 程式基本結構 資料型態與變數 運算子與運算式 流程控制 編譯與執行 Java 程式 使用執行時期參數的 Hello Java !
一個簡單範例:Hello Java ! public class Hello { public static void main(String[] args) { System.out.println("Hello Java !"); } }
Java 程式基本結構 • 每一支程式就是一個類別(Class) • Source file 的名字一定要跟 Class 的名字相同,大小寫也一定要一樣,副檔名為 .java。 • public static void main(String[] args) 為程式的進入點 • main method 一定要宣告成 public static void,因為它一定要能夠被外部的 class loader 存取,而且要在一開始就存在,而且不能夠有傳回值。 • System 是系統物件,out 指 stdout,println 印完之後會換行。 • JRE class loader 需要的是 class name 而不是檔案名稱。
指令補充 • CD 更換目錄(Change Directory) • CD C:\ • DIR 列出目錄內容(Directory) • javac 執行 JAVA 編譯器(Java Compiler) • javac Hello.java • java 執行 JAVA • java Hello
Java Source Java Bytecode Compiler JRE Hello.java javac Hello.class java 編譯與執行 Java 程式 • To compile • javac Hello.java • To run • java Hello • javaw Hello (GUI 版)
JDK JRE JVM 編譯與執行 Java 程式:執行環境
資料型態與變數:基本資料型態 boolean: The value is true or false. 布林 char: 16-bit Unicode. 統一碼字元 byte: 8-bit signed integer. 有號整數 short: 16-bit signed integer. int: 32-bit signed integer. long: 64-bit signed integer. float: 32-bit signed floating point number. 浮點數 double: 64-bit signed floating point number.
Wrapper Classes包裝類別 • Character • 用於包裝字元 char • Integer, Short, Byte and Long • 用於包裝整數 int, short, byte, long • Float and Double • 用於包裝浮點數 float, double
Scalar V.S. Object 123 是 Literal(常數值) int n = 123; 是 Scalar(純量) String s = "123"; 是字串物件 Integer n = new Integer(123); 是整數物件
Scalar V.S. Object(續) • 數字才可以進行四則運算 • String s = "123"; • String z = s + s; // z 的值為 "123123" • double d = Double.parseDouble(s); • int i= Integer.parseInt(s); • double x = d + i; // x 的值為 123+123 = 246 • 物件才可以存入 Collection(集合)之中 • Vector v = new Vector(); • v.add(new Integer(123));
Autoboxing 自動將純量包成物件 public class Boxing { public static void main(String[] args) { Integer i = new Integer(10); System.out.println(i.intValue() + 10); } } public class AutoBoxing { public static void main(String[] args) { Integer i = 10; System.out.println(i + 10); } }
資料型態與變數:變數 • TypeName variableName = INI_VALUE; • double mathScore = 75.5; • ClassName variableName = INI_VALUE; • String authorName = "Bill Day"; • ClassName varName = new ClassName(); // 建立物件 • Hashtable ht = new Hashtable(); • 命名慣例 • ClassName 類別名稱第一個字母大寫 • variableName 變數名稱第一個字母小寫(Camel Naming 駱駝命名法) • CONSTANT_NAME 常數名稱全部大寫
資料型態與變數:常數(Constant & Literal) final int PASS_SCORE = 60; final long LONG_ONE = 14L; final int HEX_MASK = 0x0e; final int OCT_MASK = 016; final float PI = 3.14F; final double PI = 3.14; final double PI = 314e-2; final String LANGUAGE = "Java";
邏輯判斷 • 比較大小 • > < >= <= • 相等、不相等 • == != • 而且(所有條件都必須成立才行) • && • 或者(只要有一個條件成立即可) • ||
數學運算 • 加減乘除 • + - * / • 整數除法取餘數 • % • 5 % 2 結果為 1
運算子與運算式:運算子&優先順序 15: L: ., [], (args), (post)++, (post)-- 14: R: ++(pre), --(pre), +(Positive), -(negative), ~, ! 13: R: new, (type) 12: L: *, /, % 11: L: +, - 10: L: <<, >>, >>> 9: L: <, <=, >, >=, instanceof 8: L: ==, != 7: L: & 6: L: ^ 5: L: | 4: L: && 3: L: || 2: R: ?: 1: R: =, *=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, |=
運算子與運算式:運算式 int x = 5; x = x + 1; x <<= 2; boolean hitTop = false; String baseName = null; x++; abs = (a > 0) ? a : -a;
流程控制:if-then-else if (a > b) { // A } else { // B } // C if (a > b) { // A } // C
public class EvenOdd { public static void main(String[] args) { if (args.length != 1) { System.err.println("請輸入一個正整數"); System.exit(1); } int i = Integer.parseInt(args[0]); String msg = (i % 2 == 0) ? "偶數" : "奇數"; System.out.println("" + i + " is an " + msg + " number."); } } args.length 為 args 陣列長度 Integer.parseInt() 將字串轉換成整數 == 比較兩值是否相等 % 整數除法取餘數 System.err 指 stderr:錯誤訊息輸出裝置
標準輸出入裝置 • 標準輸入裝置(stdin) • 預設為 Console(主控台) • 如果不做 Input Redirect(輸入重新導向)則為鍵盤(Keyboard) • 標準輸出裝置(stdout) • 預設為 Console(主控台) • 如果不做 Output Redirect(輸出重新導向)則為螢幕(tty) • 標準錯誤裝置(stderr) • 預設為 Console(主控台) • 不能夠 Output Redirect • 參考 http://en.wikipedia.org/wiki/Standard_streams
流程控制:nested if-else, switch-case if (a == 0) { // A } else { if (a == 1) { // B } else { if (a == 2) { // C } else { // D } } } if (a == 0) { // A } else if (a == 1) { // B } else if (a == 2) { // C } else { // D } switch (a) { case 0: // A break; case 1: // B break; case 2: // C break; default: // D } Nested 巢狀
練習 • 寫一個程式判斷成績是否及格 • 成績 >= 60 為及格 • 成績 <= 59 為不及格 • 成績 > 100 或 < 0 必須發出警訊 • 成績由命令列參數 String[] args 輸入 • 測試資料 • java Score 80 • java Score 123 • java Score 59
流程控制:while 和 do-while 迴圈 while (A) { // B } do { // B } while (A);
流程控制:for 迴圈 for (A; B; C) { // D } for (inti = 0; i < names.length; i++) { System.out.println("Hello "+names[i]); }
練習 • 步驟一: • 寫一個程式將命令列參數依序印出 • 測試資料 • java Echo 1 2 3 4印出:1 2 3 4 • 步驟二: • 將程式改成反序印出 • 測試資料 • java Echo 1 2 3 4印出:4 3 2 1
流程控制:break 和 continue for (..;..;..) { ... if (...) { break; } ... if (...) { continue; } ... } 立刻回頭 開始下一回合 立刻中斷迴圈
練習 • 寫一個程式將命令列參數之中的偶數依序印出 • 遇到負數時立即停止列印 • 只印出偶數,奇數忽略不印出 • 假設命令列參數只輸入正整數 • 0 是偶數 • 測試資料 • java Even 1 2 3 4印出:2 4 • java Even 2 3 0 -1 4 5印出:2 0
練習 • 設計一個 Java 程式,計算從命令列帶入的參數之總和與平均值 • 測試資料 • java Sum 1 2 3 4印出:總和為 10平均為 2.5
練習 設計一個 Java 程式,計算並印出從 1 到 10 累加的結果,例如:1+2+3+4+5+6+7+8+9+10=55 設計一個 Java 程式,計算並印出從 1 到 n 累加的結果,其中 n 是一個從命令列讀入的執行時期參數。
簡易UIJavax.swing.JOptionPane • showConfirmDialog • 要求確認, yes/no/cancel. • showInputDialog • 提示輸入 • showMessageDialog • 顯示訊息 • showOptionDialog • The Grand Unification of the above three.
JOptionPane import javax.swing.*; public class Square { public Square(){ String s = JOptionPane.showInputDialog("請輸入一個整數"); int n = Integer.parseInt(s); int nn = n * n; JOptionPane.showMessageDialog(null, s + " 的平方為: " + nn, "計算平方數", JOptionPane.PLAIN_MESSAGE); } public static void main(String[] args){ Square square = new Square(); } }
class ConfirmExit implements Application.ExitListener { public boolean canExit(EventObject e) { if (dctsdk.isServerOnLine()) { int option = JOptionPane.showConfirmDialog( getFrame(), "Do you really wants exit?", "Confirmation Required", JOptionPane.YES_NO_OPTION); if (option == JOptionPane.YES_OPTION) { dctsdk.stopServer(); } else { return false; } } return true; } public void willExit(EventObject e) { } } // ask for confirmation on exit getApplication().addExitListener(new ConfirmExit());
Object[] possibleValues = { IDctSdk.KeyboardCaseOptions.ToUpper + " 全部大寫", IDctSdk.KeyboardCaseOptions.ToLower + " 全部小寫", IDctSdk.KeyboardCaseOptions.Intact + " 不轉換", IDctSdk.KeyboardCaseOptions.Inverse + " 大小寫互換" }; String selectedValue = (String) JOptionPane.showInputDialog(this.getFrame(), "請選擇鍵盤輸入英文字母之轉換方式", "英文字母轉換方式", JOptionPane.INFORMATION_MESSAGE, null, possibleValues, possibleValues[0]); String[] ss = selectedValue.split(" "); if (ss[0].equals(IDctSdk.KeyboardCaseOptions.ToUpper.toString())) { dctsdk.setKeyboardCase(IDctSdk.KeyboardCaseOptions.ToUpper.ordinal()); } else if (ss[0].equals(IDctSdk.KeyboardCaseOptions.ToLower.toString())) { dctsdk.setKeyboardCase(IDctSdk.KeyboardCaseOptions.ToLower.ordinal()); } else if (ss[0].equals(IDctSdk.KeyboardCaseOptions.Inverse.toString())) { dctsdk.setKeyboardCase(IDctSdk.KeyboardCaseOptions.Inverse.ordinal()); } else { dctsdk.setKeyboardCase(IDctSdk.KeyboardCaseOptions.Intact.ordinal()); } setStatusMessageKeyboardCase(dctsdk.getKeyboardCase());
以 BufferedReader 從 Console 讀取一行字串 BufferedReader con = new BufferedReader( new InputStreamReader(System.in)); String s = con.readLine(); int n = -1; try { n = Integer.parseInt(s); } catch (NumberFormatException ex) { ex. printStackTrace(); }
以 Scanner從 Console 讀取資料 Scanner sc = new Scanner(System.in); int i = sc.nextInt(); Scanner sc = new Scanner(new File("myNumbers")); while (sc.hasNextLong()) { long aLong = sc.nextLong(); } java.util.Scanner
練習 • 設計一個 Java 程式,計算並印出從 1 到 n 累加的結果,例如 n=10:1+2+3+4+5+6+7+8+9+10=55 • 輸入/輸出方式: • 以 JOptionPane 讀入 n 值,JOptionPane 輸出 • 提示 • 以 Integer.parseInt() 將字串轉成數字
練習 • 寫一個程式,作用為接受十進位整數,然後顯示其二進位、八進位與十六進位值。 • 提示 • Integer.toBinaryString(number); 二進位 • Integer.toOctalString(number); 八進位 • Integer.toHexString(number); 十六進位
練習 • 印出九九乘法表 • 以兩層迴圈實作 • 兩欄之間以 \t 分隔