Java 簡介(Part 1)
Download
Report
Transcript Java 簡介(Part 1)
Java Programming (Part 1)
Introduction
鄧姚文
http://www.ywdeng.idv.tw
[email protected]
1
內容大綱
Java 語言簡介
Java 程式基礎
一個簡單範例:Hello Java !
Java 程式基本結構
資料型態與變數
運算子與運算式
流程控制
編譯與執行 Java 程式
使用執行時期參數的 Hello Java !
2
參考書目
林信良 著,Java SE6 技術手冊,碁峰資訊
,2007年,書號: ACL023000,ISBN:
9789861811321
黃嘉輝 著, Java SE 6.0視窗程式設計之道
,碁峰資訊,2009年,書號: AEL006900
,ISBN: 9789861816104
3
Java 語言簡介:
Java 的由來
1995 年發表 by Sun Microsystems
原名 Oak,Project Green,目標消費性電子產
品
作者 James Gosling
Java 最早的成功應用:
Java Applet:製作網頁上的動態效果
JavaScript:Netscape, 處理網頁上的物件
4
Java 語言簡介:
特性、優缺點
安全:受管制的 I/O、沒有 Pointer
跨平台:Java 程式在虛擬機器(VM)上執行,
任何環境只要實作虛擬機器,就可以執行 Java
程式
簡單易學的物件導向語言
API 眾多,提供各種資料結構,適用各種應用
穩定,良好的 Exception Handling 機制
多執行緒(Multithread)
缺點:速度較慢
5
Java 語言簡介:
Java 的重要性
Java 程式設計師的數量逐年暴增。
絕大部分的大專院校都有開 Java 課程,資
訊相關科系將 Java 列為必修的程式語言。
美國的學院委員會(The College Board)決
定進階教育資訊課程規劃會全部改版納入
物件導向,並選用 Java 當作考試時使用的
語言。
6
Java 語言簡介:Java 的版本
JAVA SE(Java Platform, Standard Edition)
JAVA EE(Java Platform, Enterprise Edition)
桌面應用程式、GUI、資料庫、網路、…
N-Tier Applications、Web Applications、…
JAVA ME(Java Platform, Micro Edition)
PDA、手機、Smart Card、…
7
JAVA 版本編號
JDK 1.2~1.4 之間的版本,稱為 J2SE(Java 2
Platform, Standard Edition)
J2SE 5.0(Java 2 Platform Standard Edition 5.0)
時的JDK稱為J2SE Development Kit 5.0
從Java SE 6(Java Platform, Standard Edition 6)
開始的JDK6則稱之為Java SE Development Kit 6
不再帶有2這個號碼,版本號6或1.6.0都使用
6是產品版本(Product Version),而1.6.0是開
發者版本(Developer Version)
8
Java Platform Edition
摘自http://thisjava.blogsome.com/2005/03/28/java-technology/
Java Platform & Products
10
Java 語言簡介:
Java 認證考試
摘自http://www.sun.com/training/certification/java/index.xml
11
JAVA 開發環境
JDK
NetBeans
http://java.sun.com
安裝後,設定 %JAVA_HOME% 環境變數
Online Document
http://www.netbeans.org
Eclipse
http://www.eclipse.org
12
瞭解JDK (1)
JDK: Java Development Kit 開發套件
JRE: Java Runtime Environment 執行環境
公用JRE是給開發好的程式之執行平台
JDK本身也有自己的JRE
位於JDK安裝目錄的「jre」目錄下
JDK本身所附的JRE比公用JRE多了個Server
的VM(Virtual Machine)執行選項
13
瞭解JDK (2)
JDK的JRE有server選項
14
JDK的安裝目錄
「bin」目錄
「demo」目錄
範例程式
「jre」目錄
JDK的工具程式
JDK自己附帶的JRE
「db」目錄
Apache Derby資料庫,純Java所撰寫的資料庫
15
JDK的安裝目錄
「lib」目錄
工具程式實際上會使用的Java工具類別
JDK中的工具程式,大多也是由Java所撰寫
而成
bin資料夾下的工具程式,不過是個包裝器
(Wrapper)
執行javac.exe等程式時,最後會呼叫lib目錄
中tools.jar中的對應類別
16
JDK的安裝目錄
src.zip
Java提供的API類別之原始碼檔案壓縮檔
17
設定 JAVA_HOME 環境變數
JAVA_HOME 環境變數的值為 JDK 的安裝目
錄
18
設定 Path 環境變數 (1)
找不到javac工具程式
設定系統變數中的 Path 環境變數
19
設定 Path 環境變數 (2)
Windows下安裝JRE時,會將java.exe複製至
「C:\Windows\System32\」路徑之下,而
這個路徑在Path變數中是預設的路徑
20
設定 CLASSPATH 環境變數 (1)
Java執行環境本身就是個平台,執行於這個
平台上的程式是已編譯完成的Java程式
設定Path變數是為了讓作業系統找到指定的
工具程式(例如Windows exe)
設定classpath目的就是為了讓Java執行環境
找到指定的Java程式(JVM class)
21
設定 CLASSPATH 環境變數 (2)
JDK 6 預設會到現行工作目錄,以及JDK的
「lib」目錄中尋找Java程式
Classpath 通常包含目錄名稱與 JAR 檔名稱
編譯時期指定類別搜尋路徑
javac -classpath path1;path2 …
執行時期指定類別搜尋路徑
java -classpath path1;path2 …
22
設定 CLASSPATH 環境變數 (3)
23
修改 Windows 檔案總管的設定
顯示副檔名
24
Java 程式基礎
一個簡單範例:Hello Java !
Java 程式基本結構
資料型態與變數
運算子與運算式
流程控制
編譯與執行 Java 程式
使用執行時期參數的 Hello Java !
25
一個簡單範例:Hello Java !
public class Hello {
public static void main(String[] args) {
System.out.println("Hello Java !");
}
}
26
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 而不是檔案名
稱。
27
指令補充
CD 更換目錄(Change Directory)
DIR 列出目錄內容(Directory)
javac 執行 JAVA 編譯器(Java Compiler)
CD C:\
javac Hello.java
java 執行 JAVA
java Hello
28
編譯與執行 Java 程式
Java
Source
Hello.java
JRE
javac
Hello.class
java
To compile
Compiler
Java
Bytecode
javac Hello.java
To run
java Hello
javaw Hello (GUI 版)
29
JAVA 程式的編譯與執行
30
編譯與執行 Java 程式:
執行環境
JVM
JRE
31
JDK
JAVA 執行環境架構
32
33
資料型態與變數:
基本資料型態
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.
34
Wrapper Classes
包裝類別
Character
Integer, Short, Byte and Long
用於包裝字元 char
用於包裝整數 int, short, byte, long
Float and Double
用於包裝浮點數 float, double
35
Scalar V.S. Object
123 是 Literal(常數值)
int n = 123; 是 Scalar(純量)
String s = "123"; 是字串物件
Integer n = new Integer(123); 是整數物件
36
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));
37
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);
}
}
38
資料型態與變數:變數
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 常數名稱全部大寫
39
資料型態與變數:
常數(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";
40
邏輯判斷
比較大小
>=
<=
==
!=
而且(所有條件都必須成立才行)
<
相等、不相等
>
&&
或者(只要有一個條件成立即可)
||
41
數學運算
加減乘除
+
-
*
/
整數除法取餘數
%
5 % 2 結果為 1
42
運算子與運算式:
運算子&優先順序
15:
14:
13:
12:
11:
10:
9:
8:
7:
6:
5:
4:
3:
2:
1:
L:
R:
R:
L:
L:
L:
L:
L:
L:
L:
L:
L:
L:
R:
R:
., [], (args), (post)++, (post)-++(pre), --(pre), +(Positive), -(negative), ~, !
new, (type)
*, /, %
+, <<, >>, >>>
<, <=, >, >=, instanceof
==, !=
&
^
|
&&
||
?:
=, *=, /=, %=, +=, -=, <<=, >>=, >>>=, &=, ^=, |=
43
運算子與運算式:
運算式
int x = 5;
x = x + 1;
x <<= 2;
boolean hitTop = false;
String baseName = null;
x++;
abs = (a > 0) ? a : -a;
44
流程控制:
if-then-else
tru e
fa ls e
tru e
?
A
fa lse
?
B
A
C
C
if (a > b) {
// A
} else {
// B
}
// C
if (a > b) {
// A
}
// C
45
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:錯誤訊息輸出裝置
46
標準輸出入裝置
標準輸入裝置(stdin)
標準輸出裝置(stdout)
預設為 Console(主控台)
如果不做 Output Redirect(輸出重新導向)則為螢幕
(tty)
標準錯誤裝置(stderr)
預設為 Console(主控台)
如果不做 Input Redirect(輸入重新導向)則為鍵盤
(Keyboard)
預設為 Console(主控台)
不能夠 Output Redirect
參考 http://en.wikipedia.org/wiki/Standard_streams
47
流程控制:
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
}
Nested 巢狀
48
switch (a) {
case 0:
// A
break;
case 1:
// B
break;
case 2:
// C
break;
default:
// D
}
練習
寫一個程式判斷成績是否及格
成績 >= 60 為及格
成績 <= 59 為不及格
成績 > 100 或 < 0 必須發出警訊
成績由命令列參數 String[] args 輸入
測試資料
java Score 80
java Score 123
java Score 59
49
流程控制:
while 和 do-while 迴圈
fa lse
A
B
tru e
B
tru e
A
fa lse
while (A) {
do {
// B
// B
}
} while (A);
50
流程控制:
for 迴圈
for (A; B; C) {
A
// D
}
fa ls e
B
tru e
D
for (int i = 0; i < names.length; i++) {
System.out.println("Hello "+names[i]);
}
51
C
練習
步驟一:
寫一個程式將命令列參
數依序印出
測試資料
步驟二:
將程式改成反序印出
測試資料
java Echo 1 2 3 4
印出:
1234
52
java Echo 1 2 3 4
印出:
4321
流程控制:
break 和 continue
立刻回頭
開始下一回合
for (..;..;..) {
...
if (...) {
break;
}
...
if (...) {
continue;
}
...
}
53
立刻中斷迴圈
練習
寫一個程式將命令列
參數之中的偶數依序
印出
測試資料
遇到負數時立即停止列
印
只印出偶數,奇數忽略
不印出
假設命令列參數只輸入
正整數
0 是偶數
54
java Even 1 2 3 4
印出:
24
java Even 2 3 0 -1 4 5
印出:
20
練習
設計一個 Java 程式,計算從命令列帶入的
參數之總和與平均值
測試資料
java Sum 1 2 3 4
印出:
總和為 10
平均為 2.5
55
練習
設計一個 Java 程式,計算並印出從 1 到 10
累加的結果,例如:
1+2+3+4+5+6+7+8+9+10=55
設計一個 Java 程式,計算並印出從 1 到 n
累加的結果,其中 n 是一個從命令列讀入
的執行時期參數。
56
Java Applet
Application Let
在網頁環境中執行的小應用程式
Applet
JVM
瀏覽器
57
HelloApplet.java
import java.applet.Applet;
import java.awt.*;
public class HelloApplet extends Applet
{
public void paint(Graphics g)
{
g.drawString("Hello Applet !!", 50, 50);
}
}
58
HelloApplet.html
<html>
<head><title>Applet Demo</title></head>
<body>
<applet codebase="classes" code="HelloApplet.class"
width="350" height="200">
This browser does not appear to support Applets.
</applet>
</body>
</html>
59
Applet 傳參數
<HTML><HEAD><TITLE>Applet 傳參數
</TITLE></HEAD>
<BODY>
<APPLET CODE="HelloApplet2" HEIGHT="200"
WIDTH="200">
<PARAM NAME="name" VALUE="鄧姚文"></APPLET>
</BODY>
</HTML>
60
HelloApplet2.java
import javax.swing.*;
import java.awt.*;
public class HelloApplet2 extends JApplet {
private String name = null;
public void paint(Graphics g) {
g.drawString(name + " 您好!", 100, 100);
}
public void init() {
this.name = this.getParameter("name");
}
}
61
簡易UI
Javax.swing.JOptionPane
showConfirmDialog
showInputDialog
提示輸入
showMessageDialog
要求確認, yes/no/cancel.
顯示訊息
showOptionDialog
The Grand Unification of the above three.
62
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();
}
}
63
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());
64
65
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());
66
67
以 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();
}
68
以 Scanner
從 Console 讀取資料
java.util.Scanner
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
Scanner sc = new Scanner(new File("myNumbers"));
while (sc.hasNextLong()) {
long aLong = sc.nextLong();
}
69
練習
設計一個 Java 程式,計算並印出從 1 到 n
累加的結果,例如 n=10:
1+2+3+4+5+6+7+8+9+10=55
輸入/輸出方式:
以 JOptionPane 讀入 n 值,JOptionPane 輸出
提示
以 Integer.parseInt() 將字串轉成數字
70
練習
寫一個程式,作用為接受十進位整數,然
後顯示其二進位、八進位與十六進位值。
提示
Integer.toBinaryString(number); 二進位
Integer.toOctalString(number); 八進位
Integer.toHexString(number); 十六進位
71
練習
印出九九乘法表
以兩層迴圈實作
兩欄之間以 \t 分隔
72