1.交作業
1. 平常成績
=> 將做好的 Java Project 打包成 zip 或 rar, 寄到 email 即可。
2. 階段成績
=> 參考『網路資料庫_Java課程_報告範例.docx』,將相關欄位段落寫好之後,
可儲存成 doc 或 pdf 格式,同樣寄到老師的 email 即可。
2.題目
實作題目如下,各別版本進程有:
A: 九九乘法
v1 => 利用雙迴圈顯示九九乘法表
v2 => 利用 Applet 之 Label (e.g. Q: 3 x 7 = ?) + TextField + Button 進行 GUI 單一問題問答
※可再利用 Math.random() 動態出題,完成報告
B: 點餐系統
v1 => 利用陣列 + Scanner 進行點餐問答
v2 => 利用 Applet 之 Label + Button + counter 進行 GUI 點餐問答
※可再新增圖片介紹,完成報告
C: 通訊錄查詢系統
v1 => 可用 file 進行資料讀取,配合 Array 與 class Contact,完成 Console 版資料查詢
v2 => 可用 JavaDB 進行資料讀取,配合 ArrayList 與 class Contact,完成 Console 版資料查詢
※可利用 Applet 之 Label + TextField + Button 進行 GUI 資料查詢,完成報告
D: 簡單動畫
v1 => 可用 Applet 之 paint() 功能配合 Image + drawImage() + Thread 完成簡單動畫
v2 => 可用 Applet 之 paint() 功能配合 array of Image + Thread 完成簡單相片輪播動畫
※可再利用 Math.random() 與 MouseListener,完成戳氣球遊戲程式報告
E: 單選介面
v1 => 可用 Applet 之 RadionButton + ButtonGroup ,完成單選題目判讀
※可再利用 file 或JavaDB 進行資料讀取,完成至少兩題之單選題目判讀
Showing posts with label JAVA 2. Show all posts
Showing posts with label JAVA 2. Show all posts
JAVA 2 Basic part 11
1.MVC 介紹
M: Model (模式)
V:View (視圖)
C:Controller (控制器)
mouseClicked( ) 點選滑鼠按鍵時
mouseEntered( ) 游標進入 Applet 範圍時
mouseExited( ) 游標離開 Applet 範圍時
mousePressed( ) 按下滑鼠按鍵時
mouseRelease( ) 放開滑鼠按鍵時
2.練習16-4
1.新增一控制器:MouseMotionListener,加以
A:註冊: addMouseListener(this)
B:實作: Move & Drag
2.將其中的 mouseDragged( ) 加以改寫,使能控制黑點移動。
3.再練習16-4
1.將黑點給成任何一張圖片 (參考 Sample 3)
2.可以利用 mouse 拖曳圖片。
思考:
1.可不可以滑鼠點到黑點上方,才能開始拖曳黑點?
2.同理:可否滑鼠點到圖片
4.匿名類別
mouseAdapter:參考課本 P.377 ~ P.378 (Sample5)
5.練習16-6
1.將 button 的作用改成開關 (練習button)
提示:
a. 兩段式開關:可利用布林,也可利用奇偶數 ( %2 ==0, %2==1 )
b.三段式開關:
可利用
%3==1 第一段
%3==2 第二段
%3==0 第三段
c.N段式開關
可利用
%N==1 第一段
%N==2 第二段
....
....
%N==N-1 第N-1段
%N==0 第N段
2.將paint( )放進來,搭配視窗元件 (練習button)
-->當 button 為開時,show 紅色訊息。
-->當 button 為關時,show 綠色訊息。
3.點餐系統視窗版:5個按鈕代表5種餐;結帳按鈕 --> 告知餐數 & 價格 (練習button)
4.氣球遊戲 (練習繪圖+ mouse)
提示:利用 Math.random( )
5.九九乘法
提示:
Q:3 X 7
A:21 (TextField 文字欄位,輸入資料)
確定 ( button)
結果: 對 OR 錯
6.簡易計算機
6.NetBeans 製作 Applet 步驟
1.New Project --> Java Class Library --> Project Name --> Finish
2.在此 Project -->滑鼠點右鍵 --> New --> other --> AWT Form (或是Swing Form) --> 選 Applet
Form (或是 JApplet Form)
3.在 Fram 的上面按滑鼠右鍵 -->setLayout --> null layout
調色盤:
JLable-1: for "Q:3 X 7"
JLable-2: for "A"
JTextField: for 答案
JButton: for "確定"
JLable-3: for Result Message
4.在Button上面點二下,自動產生 actionPerfomr( ) 之框架
5.將程式一一寫入
M: Model (模式)
V:View (視圖)
C:Controller (控制器)
mouseClicked( ) 點選滑鼠按鍵時
mouseEntered( ) 游標進入 Applet 範圍時
mouseExited( ) 游標離開 Applet 範圍時
mousePressed( ) 按下滑鼠按鍵時
mouseRelease( ) 放開滑鼠按鍵時
2.練習16-4
1.新增一控制器:MouseMotionListener,加以
A:註冊: addMouseListener(this)
B:實作: Move & Drag
2.將其中的 mouseDragged( ) 加以改寫,使能控制黑點移動。
3.再練習16-4
1.將黑點給成任何一張圖片 (參考 Sample 3)
2.可以利用 mouse 拖曳圖片。
思考:
1.可不可以滑鼠點到黑點上方,才能開始拖曳黑點?
2.同理:可否滑鼠點到圖片
4.匿名類別
mouseAdapter:參考課本 P.377 ~ P.378 (Sample5)
5.練習16-6
1.將 button 的作用改成開關 (練習button)
提示:
a. 兩段式開關:可利用布林,也可利用奇偶數 ( %2 ==0, %2==1 )
b.三段式開關:
可利用
%3==1 第一段
%3==2 第二段
%3==0 第三段
c.N段式開關
可利用
%N==1 第一段
%N==2 第二段
....
....
%N==N-1 第N-1段
%N==0 第N段
2.將paint( )放進來,搭配視窗元件 (練習button)
-->當 button 為開時,show 紅色訊息。
-->當 button 為關時,show 綠色訊息。
3.點餐系統視窗版:5個按鈕代表5種餐;結帳按鈕 --> 告知餐數 & 價格 (練習button)
4.氣球遊戲 (練習繪圖+ mouse)
提示:利用 Math.random( )
5.九九乘法
提示:
Q:3 X 7
A:21 (TextField 文字欄位,輸入資料)
確定 ( button)
結果: 對 OR 錯
6.簡易計算機
6.NetBeans 製作 Applet 步驟
1.New Project --> Java Class Library --> Project Name --> Finish
2.在此 Project -->滑鼠點右鍵 --> New --> other --> AWT Form (或是Swing Form) --> 選 Applet
Form (或是 JApplet Form)
調色盤:
JLable-1: for "Q:3 X 7"
JLable-2: for "A"
JTextField: for 答案
JButton: for "確定"
JLable-3: for Result Message
4.在Button上面點二下,自動產生 actionPerfomr( ) 之框架
5.將程式一一寫入
JAVA 2 Basic part 10
1.第十一章
多載 ( overloading ):同一類別內的同名異式。
覆寫 (overriding):父、子類別的同名異式。
多形 (多面性、polymorphism ):透過父類別的變數存取子類別的物件。
a.記誦口訣:藉由父類別的指標 (參考、變數),指向子類別的實體(物件)。
e.g:Parent p = new child ( ) ;
b.應用:可以此變數指向子類別之同名方法(藉由覆寫),達到橫跨子物件之目的。
c.應用實例:
A. 父類別 Car vs. 二個子類別 RacingCar & Taxi
B. 父類別 Shape vs. 四個子類別 Circle Triangle Rect Square
==> 可以達到橫跨子物件之程式呼叫功能,進而用來做加總、平均、等統計或其他應用。
toSring( ):將代表字串的物件作為傳回值並傳回呼叫端。
equals( ):驗證某兩物件是否相同,是就傳回 true,否就傳回 false。
getClass( ):傳回 "該物件究竟屬於哪一個類別"。
2.第十二章
抽象 (abstract):在 class 內的抽象方法就像是未做完的方法,必須等用到該類別的物件來建立方法,而且是強制一定要建立。
介面 (interface):在 interface 內的所有方法都是抽象方法,皆不可完成。以此規則來限制所以繼承此介面的類別,都一定要定義方法。可以在當物件很多時,以免漏掉。
要用 implement 來宣告介面例如:
class car implement iVehicle
PS:
1. 多執行緒有二種, Thread、Runnable。
Thread 是要用繼承,用 extends 來宣告。
Runnable 是要用介面,用 implement 來宣告。
2. 一次只能繼承一個,若要多個要靠介面,但要注意介面是抽象類別。
3.第十六章
Applet:建議的瀏覽器嵌入小程式,可以畫圖。
圖片必須放在bin 資料夾內,與 class 同一層。
名言:Applet 會做成 class 檔案,然後要從 server 端下載 class 檔案到客戶端,所以若 class 檔案太大、頻寬不足或壅塞,會造成反應太慢,客戶不想等。所以漸漸被 Java Script 所取代。
4.重點整理
1.第十一章 (繼承+多形)
5.6.多形
7.toString( )
8.equals( )
9.getClass( )
2.第十二章 (抽象+介面)
1抽象類別 --> 輔助多形
2.instanceof 運算子 --> 判別多形之不同物件
3.介面 --> 輔助單一繼承之不足 --> 規範子類別
4.
3.第十五章
1.繼承 Thread -->覆寫 run( ) --> 使用 start( )
2.啟動多個 Thread
3.4.使用sleep( ) -->可暫停
5.join
6.利用 Runnable 介面 -->可代替 Thread
7. 同步 Synchronized 可以控制多執行緒在存取同一資料時,可以分開存取,使得被存取的資料可以維持同步。
4.第十六章
1.繼承 Applet -->覆寫 paint( ) -->可嵌入 HTML內
1.2.可畫線、字、圖
3.可畫 image 圖片
4.5.6.人機介面 mouse
7.動畫 + sleep( ) + repaint( )
PS:自行註解
說明畫圓程式碼的意思:內含建構子、繼承、陣列等觀念
程式碼
class Shape {
//宣告 Shape 類別 (園區S設計圖),沒有用修飾子,代表修飾子是 default。
double [] edgeOrRadius;
//宣告一個 double陣列(園區設備的設計圖),名稱為 edgeOrRadius。
Shape(double... edges) {
//宣告一個 Shape建構子(沒有用public)(工廠1的設計圖),參數為未知固定數量的 double 值,名稱為 edges。
// 陣列初始化
edgeOrRadius = new double[edges.length];
for(int i = 0; i< edges.length; i++)
edgeOrRadius[i] = edges[i];
}
double getArea() { return -1; } //(工廠2的設計圖)
double getCircumference() { return -1; } //(工廠3的設計圖)
}
class Circle extends Shape { //圓形,宣告一個 Circle 類別 (園區C設計圖),並繼承 Shape。
Circle(double r) {
/*
宣告一個 Circle 建構子 (Circle工廠 ),參數為 double 的值,名稱為 r,可以給後面的 main 方法來用。所以 main 會傳給這裡的 r 一個值。
*/
super(r);
/*
這裡使用 super 就是指要宣告一個 Shape 父類別,將上一行的 r 所拿到的值放進來,然後再傳到 Shape 父類別 Shape(double... edges),這裡就可以看出為何Shape(double... edges)要設定未知固定數量的 double 值,因為後面還有三角形、矩形等等,每個參數數量皆不同。
*/
}
double getArea() {
return Math.PI * edgeOrRadius[0] * edgeOrRadius[0];
}
double getCircumference() {
return 2 * Math.PI * edgeOrRadius[0];
}
}
class Triangle extends Shape { // 三角形
Triangle(double a, double b, double c) {
super(a, b, c);
}
double getArea() {
double s = getCircumference() / 2;
// 海龍公式
return Math.sqrt( s*(s-edgeOrRadius[0])*(s-edgeOrRadius[1])*(s-edgeOrRadius[2]));
}
double getCircumference() {
double s = 0;
for(double edge : edgeOrRadius) {
s += edge;
}
return s;
}
}
class Rect extends Shape { // 矩形
Rect(double w, double h) {
super(w, h, w, h);
}
double getArea() {
return edgeOrRadius[0] * edgeOrRadius[1];
}
double getCircumference() {
double result = 0;
for(int i=0; i< edgeOrRadius.length; i++)
result += edgeOrRadius[i];
return result;
}
}
class Square extends Rect { // 正方形
Square(double edge) {
super(edge, edge);
}
}
public class TestShapeInheritance {
public static void main(String[] args) { // main 在這裡
Shape [] shape = new Shape[4];
//宣告一個Shape 陣列 取名叫 shape (將 Shape園區1設計圖拿來,用 new 指令來蓋 4 個。)
shape[0] = new Circle(10);
// shape [0] 園區用來蓋 Circle工廠
shape[1] = new Triangle(3, 4, 5);
shape[2] = new Rect(30, 40);
shape[3] = new Square(50);
double total = 0;
for(int i=0; i<shape.length; i++) {
System.out.println("shape[" + i + "]的面積 = " + shape[i].getArea());
total += shape[i].getArea();
System.out.println("shape[" + i + "]的周長 = " + shape[i].getCircumference());
}
System.out.println("total area = "+total);
多載 ( overloading ):同一類別內的同名異式。
覆寫 (overriding):父、子類別的同名異式。
多形 (多面性、polymorphism ):透過父類別的變數存取子類別的物件。
a.記誦口訣:藉由父類別的指標 (參考、變數),指向子類別的實體(物件)。
e.g:Parent p = new child ( ) ;
b.應用:可以此變數指向子類別之同名方法(藉由覆寫),達到橫跨子物件之目的。
c.應用實例:
A. 父類別 Car vs. 二個子類別 RacingCar & Taxi
B. 父類別 Shape vs. 四個子類別 Circle Triangle Rect Square
==> 可以達到橫跨子物件之程式呼叫功能,進而用來做加總、平均、等統計或其他應用。
toSring( ):將代表字串的物件作為傳回值並傳回呼叫端。
equals( ):驗證某兩物件是否相同,是就傳回 true,否就傳回 false。
getClass( ):傳回 "該物件究竟屬於哪一個類別"。
2.第十二章
抽象 (abstract):在 class 內的抽象方法就像是未做完的方法,必須等用到該類別的物件來建立方法,而且是強制一定要建立。
介面 (interface):在 interface 內的所有方法都是抽象方法,皆不可完成。以此規則來限制所以繼承此介面的類別,都一定要定義方法。可以在當物件很多時,以免漏掉。
要用 implement 來宣告介面例如:
class car implement iVehicle
PS:
1. 多執行緒有二種, Thread、Runnable。
Thread 是要用繼承,用 extends 來宣告。
Runnable 是要用介面,用 implement 來宣告。
2. 一次只能繼承一個,若要多個要靠介面,但要注意介面是抽象類別。
3.第十六章
Applet:建議的瀏覽器嵌入小程式,可以畫圖。
圖片必須放在bin 資料夾內,與 class 同一層。
名言:Applet 會做成 class 檔案,然後要從 server 端下載 class 檔案到客戶端,所以若 class 檔案太大、頻寬不足或壅塞,會造成反應太慢,客戶不想等。所以漸漸被 Java Script 所取代。
4.重點整理
1.第十一章 (繼承+多形)
5.6.多形
7.toString( )
8.equals( )
9.getClass( )
2.第十二章 (抽象+介面)
1抽象類別 --> 輔助多形
2.instanceof 運算子 --> 判別多形之不同物件
3.介面 --> 輔助單一繼承之不足 --> 規範子類別
4.
3.第十五章
1.繼承 Thread -->覆寫 run( ) --> 使用 start( )
2.啟動多個 Thread
3.4.使用sleep( ) -->可暫停
5.join
6.利用 Runnable 介面 -->可代替 Thread
7. 同步 Synchronized 可以控制多執行緒在存取同一資料時,可以分開存取,使得被存取的資料可以維持同步。
4.第十六章
1.繼承 Applet -->覆寫 paint( ) -->可嵌入 HTML內
1.2.可畫線、字、圖
3.可畫 image 圖片
4.5.6.人機介面 mouse
7.動畫 + sleep( ) + repaint( )
PS:自行註解
說明畫圓程式碼的意思:內含建構子、繼承、陣列等觀念
程式碼
class Shape {
//宣告 Shape 類別 (園區S設計圖),沒有用修飾子,代表修飾子是 default。
double [] edgeOrRadius;
//宣告一個 double陣列(園區設備的設計圖),名稱為 edgeOrRadius。
Shape(double... edges) {
//宣告一個 Shape建構子(沒有用public)(工廠1的設計圖),參數為未知固定數量的 double 值,名稱為 edges。
// 陣列初始化
edgeOrRadius = new double[edges.length];
for(int i = 0; i< edges.length; i++)
edgeOrRadius[i] = edges[i];
}
double getArea() { return -1; } //(工廠2的設計圖)
double getCircumference() { return -1; } //(工廠3的設計圖)
}
class Circle extends Shape { //圓形,宣告一個 Circle 類別 (園區C設計圖),並繼承 Shape。
Circle(double r) {
/*
宣告一個 Circle 建構子 (Circle工廠 ),參數為 double 的值,名稱為 r,可以給後面的 main 方法來用。所以 main 會傳給這裡的 r 一個值。
*/
super(r);
/*
這裡使用 super 就是指要宣告一個 Shape 父類別,將上一行的 r 所拿到的值放進來,然後再傳到 Shape 父類別 Shape(double... edges),這裡就可以看出為何Shape(double... edges)要設定未知固定數量的 double 值,因為後面還有三角形、矩形等等,每個參數數量皆不同。
*/
}
double getArea() {
return Math.PI * edgeOrRadius[0] * edgeOrRadius[0];
}
double getCircumference() {
return 2 * Math.PI * edgeOrRadius[0];
}
}
class Triangle extends Shape { // 三角形
Triangle(double a, double b, double c) {
super(a, b, c);
}
double getArea() {
double s = getCircumference() / 2;
// 海龍公式
return Math.sqrt( s*(s-edgeOrRadius[0])*(s-edgeOrRadius[1])*(s-edgeOrRadius[2]));
}
double getCircumference() {
double s = 0;
for(double edge : edgeOrRadius) {
s += edge;
}
return s;
}
}
class Rect extends Shape { // 矩形
Rect(double w, double h) {
super(w, h, w, h);
}
double getArea() {
return edgeOrRadius[0] * edgeOrRadius[1];
}
double getCircumference() {
double result = 0;
for(int i=0; i< edgeOrRadius.length; i++)
result += edgeOrRadius[i];
return result;
}
}
class Square extends Rect { // 正方形
Square(double edge) {
super(edge, edge);
}
}
public class TestShapeInheritance {
public static void main(String[] args) { // main 在這裡
Shape [] shape = new Shape[4];
//宣告一個Shape 陣列 取名叫 shape (將 Shape園區1設計圖拿來,用 new 指令來蓋 4 個。)
shape[0] = new Circle(10);
// shape [0] 園區用來蓋 Circle工廠
shape[1] = new Triangle(3, 4, 5);
shape[2] = new Rect(30, 40);
shape[3] = new Square(50);
double total = 0;
for(int i=0; i<shape.length; i++) {
System.out.println("shape[" + i + "]的面積 = " + shape[i].getArea());
total += shape[i].getArea();
System.out.println("shape[" + i + "]的周長 = " + shape[i].getCircumference());
}
System.out.println("total area = "+total);
JAVA 2 Basic part 9
1.資料庫管理工具 nazorSQL
根據老師提供的步驟,一步一步做一般都可以完成,這裡僅說明一些大家常遇到的問題:
a.在安裝的步驟中,一般都會卡在這一步驟。
原因是因為 derby 資料庫的服務沒有啟動 (關於資料庫服務請參考我部落格筆記 "20120619 JAVA2 語言基礎八" 第六點課後註解 )
b.在匯入資料的步驟中,一般都會卡在資料會不進去。
原因一:在 eclipse 建立的資料庫名稱 (database name) 或資料表名稱 (table name),與 nazorSQL 要連接的名稱不一樣。
解法:在 eclipse資料庫名稱必須與 nazorSQL 要連接的名稱相同。
原因二:已經在 eclipse 中 drop 掉 table,所以 nazorSQL找不到。
解法:在 eclipse 中再建立一次資料表。
2.第十一章 繼承
繼承:
1.有再利用性,基於原設計在擴充。
2.階層架構性,將設計架構化。
繼承關係整理:
1.繼承在 Java 內用 extend 保留字取其擴充之意。
PS:繼承的功能至少有二:
a.再利用性
b.階層架構性
2.父類別的成員之存取權限子 (Access Modifier) 有四種:
a. public 最鬆
b. protected 同套件之其他類別可以存取,也可以為不同套件子類別所存取。
c. private 最嚴
d. default 同套件之其他類別及子類別可以存取。不同套件皆不可。
3.子類別內要呼叫父類別的建構子可用 super( );
4.覆寫 (overriding )是另一種 overloading 之外的同名異式,即父子類別之間採用相同名稱的方法。PS:若變數同名呢? 稱為遮蔽 ( shadowing )
3.練習
利用 "..."來帶入不確定數量的參數,類似陣列的觀念,但不需宣告陣列數量。
程式碼
class ComputeV2 {
static int getMax (int... x){
int max =0;
for(int i = 0; i< x.length; i++)
if ( x[i] > max){
max = x[i];
}
return max;
}
static int getSum (int... x){
int total =0;
for(int i = 0; i< x.length; i++)
total = total + x[i];
return total;
}
static double getAvg (int... x){
double avg = (double) getSum(x) / x.length;
return avg;
}
public static void main(String[] args) {
System.out.println("max " + ComputeV2.getMax(22,57,80,50,60));
System.out.println("Sum " + ComputeV2.getSum(22,57,80,50,60));
System.out.println("Avg " + ComputeV2.getAvg(22,57,80,50,60));
}
}
結果
4.第十五章 執行緒
緒,就是線的意思。有線頭、線尾。另有線性的概念。
單執行緒:一般的程式都是用單執行緒,一個 main 裡免只有單一作業。
多執行緒:可在主執行緒工作時,開出另一分支執行緒去做另外的工作。
範例程式碼 (三個執行緒)
import java.util.Date;
class Car extends Thread //必須先繼承 Thread 類別來使用多執行緒。所以Thread是Car的父類別。
{
private String name;
public Car(String nm)
{
name = nm;
}
public void run() // run 方法是為分身的意思。
{
for(;;){ //使用for 無窮迴圈來觀察多執行續的先後次序
//子執行續 ( sun thread )在這裡,並加上時間以利於觀察。
System.out.println("正在進行" + name + "的處理工作。"+(new Date().toLocaleString()));
}
}
}
class Sample2
{
public static void main(String[] args)
{
Car car1 = new Car("1號車");
car1.start(); //使用Car 的父類別 Thread 的 start( )來開啟多執行續,會接到 Car 的 run 方法。
Car car2 = new Car("2號車");
car2.start(); //使用Thread 類別的 start( )來開啟多執行續,會接到 Car 的 run 方法。
for(;;){ //使用for 無窮迴圈來觀察多執行續的先後次序。
//主執行續 ( main thread )在這裡,並加上時間以利於觀察。
System.out.println("正在進行main()的處理工作。"+(new Date().toLocaleString()));
}
}
}
根據老師提供的步驟,一步一步做一般都可以完成,這裡僅說明一些大家常遇到的問題:
a.在安裝的步驟中,一般都會卡在這一步驟。
原因是因為 derby 資料庫的服務沒有啟動 (關於資料庫服務請參考我部落格筆記 "20120619 JAVA2 語言基礎八" 第六點課後註解 )
b.在匯入資料的步驟中,一般都會卡在資料會不進去。
原因一:在 eclipse 建立的資料庫名稱 (database name) 或資料表名稱 (table name),與 nazorSQL 要連接的名稱不一樣。
解法:在 eclipse資料庫名稱必須與 nazorSQL 要連接的名稱相同。
原因二:已經在 eclipse 中 drop 掉 table,所以 nazorSQL找不到。
解法:在 eclipse 中再建立一次資料表。
2.第十一章 繼承
繼承:
1.有再利用性,基於原設計在擴充。
2.階層架構性,將設計架構化。
繼承關係整理:
1.繼承在 Java 內用 extend 保留字取其擴充之意。
PS:繼承的功能至少有二:
a.再利用性
b.階層架構性
2.父類別的成員之存取權限子 (Access Modifier) 有四種:
a. public 最鬆
b. protected 同套件之其他類別可以存取,也可以為不同套件子類別所存取。
c. private 最嚴
d. default 同套件之其他類別及子類別可以存取。不同套件皆不可。
3.子類別內要呼叫父類別的建構子可用 super( );
4.覆寫 (overriding )是另一種 overloading 之外的同名異式,即父子類別之間採用相同名稱的方法。PS:若變數同名呢? 稱為遮蔽 ( shadowing )
3.練習
利用 "..."來帶入不確定數量的參數,類似陣列的觀念,但不需宣告陣列數量。
程式碼
class ComputeV2 {
static int getMax (int... x){
int max =0;
for(int i = 0; i< x.length; i++)
if ( x[i] > max){
max = x[i];
}
return max;
}
static int getSum (int... x){
int total =0;
for(int i = 0; i< x.length; i++)
total = total + x[i];
return total;
}
static double getAvg (int... x){
double avg = (double) getSum(x) / x.length;
return avg;
}
public static void main(String[] args) {
System.out.println("max " + ComputeV2.getMax(22,57,80,50,60));
System.out.println("Sum " + ComputeV2.getSum(22,57,80,50,60));
System.out.println("Avg " + ComputeV2.getAvg(22,57,80,50,60));
}
}
結果
4.第十五章 執行緒
緒,就是線的意思。有線頭、線尾。另有線性的概念。
單執行緒:一般的程式都是用單執行緒,一個 main 裡免只有單一作業。
多執行緒:可在主執行緒工作時,開出另一分支執行緒去做另外的工作。
範例程式碼 (三個執行緒)
import java.util.Date;
class Car extends Thread //必須先繼承 Thread 類別來使用多執行緒。所以Thread是Car的父類別。
{
private String name;
public Car(String nm)
{
name = nm;
}
public void run() // run 方法是為分身的意思。
{
for(;;){ //使用for 無窮迴圈來觀察多執行續的先後次序
//子執行續 ( sun thread )在這裡,並加上時間以利於觀察。
System.out.println("正在進行" + name + "的處理工作。"+(new Date().toLocaleString()));
}
}
}
class Sample2
{
public static void main(String[] args)
{
Car car1 = new Car("1號車");
car1.start(); //使用Car 的父類別 Thread 的 start( )來開啟多執行續,會接到 Car 的 run 方法。
Car car2 = new Car("2號車");
car2.start(); //使用Thread 類別的 start( )來開啟多執行續,會接到 Car 的 run 方法。
for(;;){ //使用for 無窮迴圈來觀察多執行續的先後次序。
//主執行續 ( main thread )在這裡,並加上時間以利於觀察。
System.out.println("正在進行main()的處理工作。"+(new Date().toLocaleString()));
}
}
}
JAVA 2 Basic part 8
1.檔案處理補充教材
參考檔案在老師提供的 "0619_教材\2_檔案處理補充教材\CH07\" 裡面
a.資料夾與檔案的建立、刪除
參考檔案:File_Manage.java
b.資料夾與檔案的讀取 (dir)
參考檔案:File_Query.java
c.檔案內容的讀取 (以 byte 為單位來讀取,無法讀中文,因為一個中文字為二個 byte)
參考檔案:FileInOutEx.java
d.檔案內容的讀取 (以 char 為單位來讀取,一個字一個字的讀取)
參考檔案:FileReadWriteEx.java
e.檔案內容的讀取 (以"行" 為單位來讀取,一行一行的讀取)
參考檔案:BufferedReadWriteEx.java
2.練習一
題目:利用 TestFile示範 ptoject 中的 BufferRead / BufferWrite 的作法,將通訊錄檔案中的 name、seatnum、email 讀出來,並存到以 class contant 所宣告的物件陣列中。
例如:
Contant [ ] cont = new Contant [ N ] //N是資料筆數
for (Contact c : cont) {
c = new Contant ( name, seatnum, email); // 資料初始化
//然後可以再批次執行 show( ) 等方法。
參考檔案在老師提供的 "0619_練習\ReadContactV3" 資料夾
3.加入檔案視之為參數
目的:讓程式在執行前載入指定的檔案,將檔案裡的資料視為參數,使程式執行。之前我們是使用在程式裡面直接輸入資料當參數。這裡是以匯入檔案的方式為練習。
a.專案名稱按右鍵 --> Run as --> Run Configurations
b.選擇 Argument 頁籤 --> 輸入檔名 (這裡是 "test1.txt" ,該檔案必須與 scr 在同一層,或是在程式裡指定參數檔案"test1.txt"所在位置的路徑。)
4.安裝JDBC工具
a.執行Java1.7版
b.執行 Java 的 derbyrun.jar 來啟動 derby 資料庫服務
c.在DOS下執行指令。
PS:不可關閉視窗,因為要維持1527 port 一直是 listen 狀態。(後面的"進階看這裡"有更詳細的解釋)
d.掛載 jar 套件,在 eclipse 選一專案按右鍵 --> 內容 --> 選 "Java Build Path" --> 選Libraries 頁籤 -->點選 "Add External JARs"。
PS:此目的是讓 eclipse 匯入跟JDBC相關的函式庫 ( Libraries),這樣才能建立資料庫連線、建立資料表等。
e.在Java1.7 版目錄下"C:\Program Files\Java\jdk1.7.0_04\db\lib" 選下面二個 jar 檔案。
f.就會在專案下面的 Refernced Libraries 看到二個 jar 已經掛起來。
PS:這樣就代表掛載函示庫成功。
g.在程式內建立連線,將資料庫路徑指向本機,埠號為1527。將 useranme & password 暫時設為 null。
5.練習二
將 sample1 修改如下
1.車子資料表 --> 通訊錄
2.編號 --> 座號
3.名稱 --> 電郵
4.在 "CREATE TABLE ( )" 的參數內新增一個參數欄位:姓名 varchar(20)
5.新增二筆通訊錄資料
6.課後自行註解
下圖是今天做的練習 sample1。關於 JDBC 的語法,分為三部分。
第一部分可只執行一次。
若使用第二部分,就不要用第三部分,二者取其一。意思是說,要嘛一、二搭,不然就一、三配。以下說明原因。
第一部分
第9行
是使用 class.forName 方法來載入JAVA 客戶端驅動程式 ( client driver)。(後面的"進階看這裡"有更詳細的解釋)
連接不同資料庫,要用不同的字串。
a.連接 apache 的 derby資料庫 的 JDBC 語法 :
Class.forName("org.apache.derby.jdbc.ClientDriver");
b.連接 Microsoft 的 SQL 2000 資料庫的 JDBC 語法:
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
c.連接 Microsoft 的 SQL 2005 資料庫 的 JDBC 語法 :
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
d.連接 MySQL 資料庫 的 JDBC 語法 :
Class.forName("com.mysql.jdbc.Driver");
第二部分
第11行
是建立一個通訊協定,將它放入字串 ( protocol )。目的就是要讓程式透過此通訊協定連線到資料庫。字串裡的 //localhost:1527 是指本機電腦的 1527 port。
另外補充:Microsoft SQL 是用 1433 port。
第12行
是建立連線,呼叫 Connection 類別,命名為 cn,呼叫 DriverManager.getConnection ( ),裡面帶幾個參數。
參數一:連線的 protocol,加上要建立的資料庫名稱 (carDB ),"create = true"的意思是要建立資料庫。
參數二:user name。
參數三: password。
這裡參數二、參數三用 null 帶過,意思是匿名存取。
第三部分
第15行,相當於第二部分的第11行。
第16,17行,宣告二個變數 usr (就是 user name 的意思),以及 pw (就是 password 的意思),並將此二變數用""來代表設為空值。
第20行,相當於第二部分的第12行。
7.進階看這裡
1.客戶端驅動程式 ( client driver)
其實就是一種服務 (service),電腦本身就提供許多服務,例如之前學過的 DHCP、DNS、SMTP 等等。資料庫是一種提供儲存資料的空間,它也是藉由服務來讓我們存取。
前面我們在DOS模式下執行了 "java -jar derbyrun.jar server start",目的就是開啟 derby 資料庫服務。然而不能關掉視窗,就是因為服務也就跟著停止了。因為 derby 不是 Microsoft 自家的產品,所以目前只能以這種方式開著,在視窗上不方便。例如 Microsoft 自家的產品 MS SQL 2000, 2005, 2008 安裝好之後,都會將服務內嵌到管理介面,只需要啟動就可以,不需要在畫面上一直開著 DOS介面。
例如在第11行的 protocol,就是指服務的通道。
DHCP 67/68
DNS 53
SMTP 25
HTTP 80
HTTPS 443
MS SQL 1433
Derby 1527
2. Derby JDBC 提供二種模式給 Java 連接資料庫,我們用第二種
Derby JDBC driver has two driver classes for Java DB (Derby) running in two different modes:
1. Embedded Driver Class, org.apache.derby.jdbc.EmbeddedDriver - Used to create connections to Java DB (Derby) running in embedded mode. The JAR file and the connection URL format for the embedded driver class are listed below:
2. Client Driver Class, org.apache.derby.jdbc.ClientDriver - Used to create connections to Java DB (Derby) running in Network Server mode. The JAR file and the connection URL format for the client driver class are listed below:
參考檔案在老師提供的 "0619_教材\2_檔案處理補充教材\CH07\" 裡面
a.資料夾與檔案的建立、刪除
參考檔案:File_Manage.java
b.資料夾與檔案的讀取 (dir)
參考檔案:File_Query.java
c.檔案內容的讀取 (以 byte 為單位來讀取,無法讀中文,因為一個中文字為二個 byte)
參考檔案:FileInOutEx.java
d.檔案內容的讀取 (以 char 為單位來讀取,一個字一個字的讀取)
參考檔案:FileReadWriteEx.java
e.檔案內容的讀取 (以"行" 為單位來讀取,一行一行的讀取)
參考檔案:BufferedReadWriteEx.java
2.練習一
題目:利用 TestFile示範 ptoject 中的 BufferRead / BufferWrite 的作法,將通訊錄檔案中的 name、seatnum、email 讀出來,並存到以 class contant 所宣告的物件陣列中。
例如:
Contant [ ] cont = new Contant [ N ] //N是資料筆數
for (Contact c : cont) {
c = new Contant ( name, seatnum, email); // 資料初始化
//然後可以再批次執行 show( ) 等方法。
參考檔案在老師提供的 "0619_練習\ReadContactV3" 資料夾
3.加入檔案視之為參數
目的:讓程式在執行前載入指定的檔案,將檔案裡的資料視為參數,使程式執行。之前我們是使用在程式裡面直接輸入資料當參數。這裡是以匯入檔案的方式為練習。
a.專案名稱按右鍵 --> Run as --> Run Configurations
b.選擇 Argument 頁籤 --> 輸入檔名 (這裡是 "test1.txt" ,該檔案必須與 scr 在同一層,或是在程式裡指定參數檔案"test1.txt"所在位置的路徑。)
4.安裝JDBC工具
a.執行Java1.7版
b.執行 Java 的 derbyrun.jar 來啟動 derby 資料庫服務
c.在DOS下執行指令。
PS:不可關閉視窗,因為要維持1527 port 一直是 listen 狀態。(後面的"進階看這裡"有更詳細的解釋)
d.掛載 jar 套件,在 eclipse 選一專案按右鍵 --> 內容 --> 選 "Java Build Path" --> 選Libraries 頁籤 -->點選 "Add External JARs"。
PS:此目的是讓 eclipse 匯入跟JDBC相關的函式庫 ( Libraries),這樣才能建立資料庫連線、建立資料表等。
e.在Java1.7 版目錄下"C:\Program Files\Java\jdk1.7.0_04\db\lib" 選下面二個 jar 檔案。
f.就會在專案下面的 Refernced Libraries 看到二個 jar 已經掛起來。
PS:這樣就代表掛載函示庫成功。
g.在程式內建立連線,將資料庫路徑指向本機,埠號為1527。將 useranme & password 暫時設為 null。
5.練習二
將 sample1 修改如下
1.車子資料表 --> 通訊錄
2.編號 --> 座號
3.名稱 --> 電郵
4.在 "CREATE TABLE ( )" 的參數內新增一個參數欄位:姓名 varchar(20)
5.新增二筆通訊錄資料
6.課後自行註解
下圖是今天做的練習 sample1。關於 JDBC 的語法,分為三部分。
第一部分可只執行一次。
若使用第二部分,就不要用第三部分,二者取其一。意思是說,要嘛一、二搭,不然就一、三配。以下說明原因。
第一部分
第9行
是使用 class.forName 方法來載入JAVA 客戶端驅動程式 ( client driver)。(後面的"進階看這裡"有更詳細的解釋)
連接不同資料庫,要用不同的字串。
a.連接 apache 的 derby資料庫 的 JDBC 語法 :
Class.forName("org.apache.derby.jdbc.ClientDriver");
b.連接 Microsoft 的 SQL 2000 資料庫的 JDBC 語法:
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
c.連接 Microsoft 的 SQL 2005 資料庫 的 JDBC 語法 :
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
d.連接 MySQL 資料庫 的 JDBC 語法 :
Class.forName("com.mysql.jdbc.Driver");
第二部分
第11行
是建立一個通訊協定,將它放入字串 ( protocol )。目的就是要讓程式透過此通訊協定連線到資料庫。字串裡的 //localhost:1527 是指本機電腦的 1527 port。
另外補充:Microsoft SQL 是用 1433 port。
第12行
是建立連線,呼叫 Connection 類別,命名為 cn,呼叫 DriverManager.getConnection ( ),裡面帶幾個參數。
參數一:連線的 protocol,加上要建立的資料庫名稱 (carDB ),"create = true"的意思是要建立資料庫。
參數二:user name。
參數三: password。
這裡參數二、參數三用 null 帶過,意思是匿名存取。
第三部分
第15行,相當於第二部分的第11行。
第16,17行,宣告二個變數 usr (就是 user name 的意思),以及 pw (就是 password 的意思),並將此二變數用""來代表設為空值。
第20行,相當於第二部分的第12行。
7.進階看這裡
1.客戶端驅動程式 ( client driver)
其實就是一種服務 (service),電腦本身就提供許多服務,例如之前學過的 DHCP、DNS、SMTP 等等。資料庫是一種提供儲存資料的空間,它也是藉由服務來讓我們存取。
前面我們在DOS模式下執行了 "java -jar derbyrun.jar server start",目的就是開啟 derby 資料庫服務。然而不能關掉視窗,就是因為服務也就跟著停止了。因為 derby 不是 Microsoft 自家的產品,所以目前只能以這種方式開著,在視窗上不方便。例如 Microsoft 自家的產品 MS SQL 2000, 2005, 2008 安裝好之後,都會將服務內嵌到管理介面,只需要啟動就可以,不需要在畫面上一直開著 DOS介面。
例如在第11行的 protocol,就是指服務的通道。
DHCP 67/68
DNS 53
SMTP 25
HTTP 80
HTTPS 443
MS SQL 1433
Derby 1527
2. Derby JDBC 提供二種模式給 Java 連接資料庫,我們用第二種
Derby JDBC driver has two driver classes for Java DB (Derby) running in two different modes:
1. Embedded Driver Class, org.apache.derby.jdbc.EmbeddedDriver - Used to create connections to Java DB (Derby) running in embedded mode. The JAR file and the connection URL format for the embedded driver class are listed below:
Class Name: org.apache.derby.jdbc.EmbeddedDriver
2. Client Driver Class, org.apache.derby.jdbc.ClientDriver - Used to create connections to Java DB (Derby) running in Network Server mode. The JAR file and the connection URL format for the client driver class are listed below:
Class Name: org.apache.derby.jdbc.ClientDriver
JAVA 2 Basic part 7
1.第十章 類別
類別成員的特性
1.常用性:例如:Math內....系列
2.共用性:例如:Car's Sum 變數
2.傳值 (Passing by Value) VS 傳址 (Passing by Address)
基本型(非參考型):(數字、文字、等一般資料)
1.不需要 new,直接配記憶體空間。
2.資料會複製一份,而非參考指向
int i=90; (不用 new,直接配一空間給 i,值為90。)
int j=i; (複製 90到另一個記憶體空間給 j,所以 j 和 i 各有各的空間,各有各的值。互不影響 )
參考型:(物件、陣列等)
1.需要 new 才配。
2. 不複製資料,僅給予相同的參考指向。所以使用相同的值及記憶體空間。
範例一:(類別物件)
class Car {
Static int Sum =0;
Car2 = Car1;
}
這裡的Car1與Car2 指向同一位置的記憶體,共用相同的值。
範例二:(陣列)
int [ ] scores
data = scores
這裡的 data 指向與 scores 相同的位置。
3.物件的陣列
Car cars[ ]; // 引用 Car類別來建立 cars陣列
cars = new Car[3];
for (int i =0; i <cars,length; i++){
cars[i] = new Car( );
}
cars[0].setCar(1234, 20.5);
cars[1].setCar(2345, 30.5);
cars[2].setCar(3456, 40.5);
for(int i=0; i< cars.length; i++){
cars[i].show();
上面的 for 迴圈可以改成用下面 for ~ each 迴圈。 for each loop, Java 5.0 後才有
for ( Car k : cars) {
k.show();
}
// for ( X Y : Z)
// X = Car類別 Y = 變數 k : 這裡用分號區隔 Z = cars陣列
// 建立 for each 迴圈,在Car 類別中,讀取每個 cars 陣列,並將每個 cars 陣列放入變數k,然後將 k ( cars 陣列 )一個一個 show 出來。
PS:說明二:另一個例子
c = new Contact( );
}
// 建立 for each 迴圈,在Contact 類別中,讀取每個 cont 陣列,並將每個 cont 陣列放入變數 c,然後將 c ( cont 陣列 )一個一個 new 起來。
4.第十三章
2+1種修飾子 for class:
1. public、2.default、3.final
4+2種修飾子 for 成員(變數、方法):
1.public、2.protected、3.private (3個保留字)、4.default (空白)、5. static (靜態)、6.final
5.Package (套件)
練習一:將 TestCh13_1專案的 Sample1.java 設定 package xyz
PS:在相同專案中不同 package下,需要靠 import package來使用 class。
1. 在 Sample1 輸入 package xyz;
2. 在 class Car 前面輸入 Public ,目的是將 Car Public 出來。
3. 在 class Car 輸入 package tw;,目的是因為原本是屬於"default package",而"default package"是沒有名字,無法被 import 。
4. 在 Sample1 匯入tw。(Java 會在Car 下面出現紅線,引導自動匯入Car。)
練習二:(Jar ) (針對要參考的函式庫在不同專案下,必須將函式庫匯入才能用)
PS:在不同專案中,需要參考的類別,需先匯出成函式庫,再給別人匯入。
出口方(export)
1.將 class寫好
2.在 project 點滑鼠右鍵,選 export --> Java --> Jar file --> Next
3.設定檔名與路徑
進口方(import)
4.將 main 寫好
5.宣告使用某個"進口"的類別及變數
6.在 project 內建立一個 lib 資料夾 (也可以不建立),將 jar 檔複製 / 貼上
7.在 project 點滑鼠右鍵,選 properties --> Java Build Path --> Libraries -->Add jar --> 所屬 project 內的 lib 資料夾 -->選取該 jar 檔
8.再回到 main,在該類別名稱上選 import,完成。
PS:產生 doc 文件
請參考 Java官方文件: Javadoc_用法_URL
6.第十四章 (例外處理:try...catch)
請參考 Java官方文件:JavaDocAPI_URL
語法:
// Phase I
System.out.println("將值指定給test[10]。");
try {
test[10] = 80;
System.out.println("將80指定給test[10]。");
}
//catch(java.lang.ArrayIndexOutOfBoundsException e) {
catch(java.lang.Exception e) {
// 參考 http://docs.oracle.com/javase/6/docs/api/
System.out.println("發生錯誤:");
e.printStackTrace();
}
finally {
System.out.println("Phase I告一段落");
}
7.輸入與輸出
串流:課本P.337 ~P.341
練習:寫4筆通訊錄資料
姓名 座號 電子郵件
Name seatnum email
王小明 1 wang@gmail.com
李大明 2 lee@gmail.com
王小梅 3 wang2@gmail.com
李大梅 4 lee2@gmail.com
讀出這4筆,置於 class contact 所 new 的4個物件中,再 show 出來。
PS:儲存與讀取檔案的預設路徑,會設定在與 "src" 資料夾同一層。
類別成員的特性
1.常用性:例如:Math內....系列
2.共用性:例如:Car's Sum 變數
2.傳值 (Passing by Value) VS 傳址 (Passing by Address)
基本型(非參考型):(數字、文字、等一般資料)
1.不需要 new,直接配記憶體空間。
2.資料會複製一份,而非參考指向
int i=90; (不用 new,直接配一空間給 i,值為90。)
int j=i; (複製 90到另一個記憶體空間給 j,所以 j 和 i 各有各的空間,各有各的值。互不影響 )
參考型:(物件、陣列等)
1.需要 new 才配。
2. 不複製資料,僅給予相同的參考指向。所以使用相同的值及記憶體空間。
範例一:(類別物件)
class Car {
Static int Sum =0;
Car2 = Car1;
}
這裡的Car1與Car2 指向同一位置的記憶體,共用相同的值。
範例二:(陣列)
int [ ] scores
data = scores
這裡的 data 指向與 scores 相同的位置。
3.物件的陣列
Car cars[ ]; // 引用 Car類別來建立 cars陣列
cars = new Car[3];
for (int i =0; i <cars,length; i++){
cars[i] = new Car( );
}
cars[0].setCar(1234, 20.5);
cars[1].setCar(2345, 30.5);
cars[2].setCar(3456, 40.5);
for(int i=0; i< cars.length; i++){
cars[i].show();
上面的 for 迴圈可以改成用下面 for ~ each 迴圈。 for each loop, Java 5.0 後才有
for ( Car k : cars) {
k.show();
}
// for ( X Y : Z)
// X = Car類別 Y = 變數 k : 這裡用分號區隔 Z = cars陣列
// 建立 for each 迴圈,在Car 類別中,讀取每個 cars 陣列,並將每個 cars 陣列放入變數k,然後將 k ( cars 陣列 )一個一個 show 出來。
PS:說明二:另一個例子
for ( Contact c : cont) {
c = new Contact( );
}
// 建立 for each 迴圈,在Contact 類別中,讀取每個 cont 陣列,並將每個 cont 陣列放入變數 c,然後將 c ( cont 陣列 )一個一個 new 起來。
4.第十三章
2+1種修飾子 for class:
1. public、2.default、3.final
4+2種修飾子 for 成員(變數、方法):
1.public、2.protected、3.private (3個保留字)、4.default (空白)、5. static (靜態)、6.final
5.Package (套件)
練習一:將 TestCh13_1專案的 Sample1.java 設定 package xyz
PS:在相同專案中不同 package下,需要靠 import package來使用 class。
1. 在 Sample1 輸入 package xyz;
2. 在 class Car 前面輸入 Public ,目的是將 Car Public 出來。
3. 在 class Car 輸入 package tw;,目的是因為原本是屬於"default package",而"default package"是沒有名字,無法被 import 。
4. 在 Sample1 匯入tw。(Java 會在Car 下面出現紅線,引導自動匯入Car。)
練習二:(Jar ) (針對要參考的函式庫在不同專案下,必須將函式庫匯入才能用)
PS:在不同專案中,需要參考的類別,需先匯出成函式庫,再給別人匯入。
出口方(export)
1.將 class寫好
2.在 project 點滑鼠右鍵,選 export --> Java --> Jar file --> Next
3.設定檔名與路徑
進口方(import)
4.將 main 寫好
5.宣告使用某個"進口"的類別及變數
6.在 project 內建立一個 lib 資料夾 (也可以不建立),將 jar 檔複製 / 貼上
7.在 project 點滑鼠右鍵,選 properties --> Java Build Path --> Libraries -->Add jar --> 所屬 project 內的 lib 資料夾 -->選取該 jar 檔
8.再回到 main,在該類別名稱上選 import,完成。
PS:產生 doc 文件
請參考 Java官方文件: Javadoc_用法_URL
6.第十四章 (例外處理:try...catch)
請參考 Java官方文件:JavaDocAPI_URL
語法:
// Phase I
System.out.println("將值指定給test[10]。");
try {
test[10] = 80;
System.out.println("將80指定給test[10]。");
}
//catch(java.lang.ArrayIndexOutOfBoundsException e) {
catch(java.lang.Exception e) {
// 參考 http://docs.oracle.com/javase/6/docs/api/
System.out.println("發生錯誤:");
e.printStackTrace();
}
finally {
System.out.println("Phase I告一段落");
}
7.輸入與輸出
串流:課本P.337 ~P.341
練習:寫4筆通訊錄資料
姓名 座號 電子郵件
Name seatnum email
王小明 1 wang@gmail.com
李大明 2 lee@gmail.com
王小梅 3 wang2@gmail.com
李大梅 4 lee2@gmail.com
讀出這4筆,置於 class contact 所 new 的4個物件中,再 show 出來。
PS:儲存與讀取檔案的預設路徑,會設定在與 "src" 資料夾同一層。
JAVA 2 Basic part 6
1.Object-Oriented Programming
a.What is a class
說明:一種能夠將資料變數與程序函數(方法),群組起來的一種 "參考型" 資料型態。
資料型態:定義容器的形狀、大小,用來定義變數。
b.What is an object
說明:以某個類別的內容為藍圖,在電腦記憶體中所動態建構出來的一種 "參考型" 變數。
c.What is the object-oriented progeamming
說明:簡言之它滿足封裝性(第8、9、10章)、繼承性(第11、12章)、與多面性(第12、13章)。
1.封裝性:可封裝資料、函數。
2.第八章練習一
仿照 sample1自訂通訊錄類別
class Contact {
String name
int number
String email
String tel
}
3.第八章練習二
設計一個 class compute,此類別可以做加總(sum)、平均(avg)、最大值(max)。
程式碼
class Compute{ //設計一個Compute類別,內含陣列、方法。
int [] data; //宣告一個 int 陣列,命名為 data。(基本資料型態)
//此data不放到下一行裡面而在這獨立是因為可以讓本class 的其他方法也能使用。
void setData(int [] nums){ //void指此方法(叫做 setData)不須回傳資料。(返回值資料型態)
//後面的程式呼叫此方法,可接收一個整數陣列(nums)的資料。
data = nums; //將接收的整數陣列(nums)的資料,一個一個放到上面data 陣列裡。
}
int [] getData(){
return data;
}
int getMax(){ //宣告一個方法,命名為 getMax,用來算最大值。
int max = -1;
for (int i=0; i<data.length; i++){
//data.length從1開始,i 是從 0開始。所以要 <,不能 <=
if (data[i] > max){ //比大小
max = data[i]; //篡位
}
}
return max;
}
int getSum(){ //宣告一個方法,命名為 getSum,用來算加總。
int sum=0;
for (int i=0; i<data.length; i++){
sum = sum + data[i]; //算加總,一個一個將 data[i] 加到 sum。
}
return sum;
}
double getAvg(){ //宣告一個方法,命名為 getAvg,用來算平均值。
double avg = (double) getSum() / data.length; //要用 double 來顯示小數點
return avg;
}
}
public class E81 {
public static void main(String[] args) {
int [] scores ={22,57,80,50,60};
Compute c = new Compute();
c.setData(scores);
System.out.println("max="+c.getMax());
System.out.println("sum="+c.getSum());
System.out.println("avg="+c.getAvg());
}
}
結果
4.第九章 建構子
1. Public & Private
Public > Protected > Default > Private
2.建構子 (constructor)
程式碼
// 車子類別
class Car
{
private int num;
private double gas;
public Car() // 這是一個建構子之1,名稱必須與 class 相同。
{
num = 0;
gas = 0.0;
System.out.println("生產了車子。");
}
public Car(int n, double g) // 這是一個建構子之2,跟建構子之1的差別是參數型別不同。
// 前面2個建構子有相同的名字,但參數個數與型別不同,叫 overloading、重載、或同名異式。
{
num = n;
gas = g;
System.out.println("生產了車號為" + num + ",汽油量為" + gas + "的車子。");
}
public void show()
{
System.out.println("車號是" + num + "。");
System.out.println("汽油量是" + gas + "。");
}
}
class Sample5
{
public static void main(String[] args)
{
Car car1 = new Car(); //使用建構子之1
car1.show();
Car car2 = new Car(1234,25.0); //使用建構子之2
car2.show();
}
}
PS:利用建構子的好處是可以直接輸入參數值,不須再呼叫 setData。
比較:
有建構子
public Car(int n, double g) { //初始建構子之2
num = n;
gas = g;
System.out.println("生產了車號為" + num + ",汽油量為" + gas + "的車子。");
}
//使用建構子之2
Car car2 = new Car(1234,25.0); //new 完就可直接輸入參數
car2.show();
無建構子 (搭配陣列)
int [] data;
void setData(int [] nums){
data = nums;
}
//使用 setData
int [] scores ={22,57,80,50,60}; (三行)
Compute c = new Compute();
c.setData(scores); //new 完需要呼叫方法 setData 來塞入陣列 scores
若要改成有建構子
Compute (int [] nums){
data = nums;
}
//使用建構子 Compute
int [] scores ={22,57,80,50,60}; (二行)
Compute c = new Compute(scores); //new 完 可直接塞入陣列 scores
//直接將陣列 score 放入( ),不須再 new Compute然後呼叫 setData後再放入score
5.第九章 類別變數、物件變數
1.類別變數: eg: static int i;
2.類別方法: eg: static int getMax(int [] score) {
int max = -1;
return max;
}
PS:static 靜態的、類別的、共用的、系統自動 new 的。
3.物件變數:在class 內所宣告的變數,前面沒有 static修飾子。
4.物件方法:在class 內所宣告的方法,前面沒有 static修飾子。
PS:生產物件需要用 new ;物件內的變數是獨自使用,不可給第2物件用。
PS:Google 所得到的資訊
1. 靜態方法沒辦法用實體方法、實體變數
2. 實體變數才能儲存每個物件個別的資料
3. 所以如果沒有要用到每個物件個別的資料,就可以寫成靜態方法 (例如做一個該類別的物件數量計數器)
6.第十章 類別庫的使用
1.字串 String (參考課本P.226)
補充1:split() 切割
使用方法:
補充2:StringBuffer VS String的字串連接
StringBuffer:
預設會先使用16個位子加上我們給的字串長度來規劃記憶體。再用Append的功能,
加上第二次給的字串,所以效能較高。
String的字串連接:
str1 = str1 + str2
會先將原本的str1從記憶體中取出,與str2 做字串相加,再放到另一區塊的記憶體。
因為要做記憶體的取出、存入,所以效能比StringBuffer低。
2.數學 Math (參考課本P.234) --> 大量使用 static,例如:Math.PI、Math.E
3.Wrapper Class:八個基本資料型態的對應類別 (int; float,...)(參考課本P.233)
7.第十章練習 (Homework)
題目:假設字串: String str ="Hello World Java"
請將每個單字取出,並顯示在螢幕上
例如:
Hello
World
Java
Hint:方法有很多
第一用split;
第二用 charAt(i)配合 for迴圈及 if;
第三用 indexof()配合 substring()
程式碼
import java.util.Scanner;
public class Ch81 {
public static void main(String[] args) {
System.out.println("請輸入字串"); //設計成可自行輸入字串,增加彈性。
Scanner scan= new Scanner(System.in);
String str = scan.nextLine();
// String str = "Hello World Java"; (老師給的字串,若要用這行就將前三行去掉)
System.out.println("原字串: "+str);
String [] segment = str.split(" ");
//利用split"" 將輸入的字串用""(空格)分開,此例有2個空格,所以分三段。3
//因此 segment陣列就包含3個字串,編號為 0、1、2。
//System.out.println(segment[0]); 直接指定陣列的編號,較不彈性。
//System.out.println(segment[1]);
//System.out.println(segment[2]);
if (segment.length != 0){ //利用迴圈來抓取陣列編號,完全自動化處理。
for (int i=0; i<segment.length; i++){
System.out.println(segment[i]);
}
}
}
}
結果
a.What is a class
說明:一種能夠將資料變數與程序函數(方法),群組起來的一種 "參考型" 資料型態。
資料型態:定義容器的形狀、大小,用來定義變數。
b.What is an object
說明:以某個類別的內容為藍圖,在電腦記憶體中所動態建構出來的一種 "參考型" 變數。
c.What is the object-oriented progeamming
說明:簡言之它滿足封裝性(第8、9、10章)、繼承性(第11、12章)、與多面性(第12、13章)。
1.封裝性:可封裝資料、函數。
2.第八章練習一
仿照 sample1自訂通訊錄類別
class Contact {
String name
int number
String email
String tel
}
3.第八章練習二
設計一個 class compute,此類別可以做加總(sum)、平均(avg)、最大值(max)。
程式碼
class Compute{ //設計一個Compute類別,內含陣列、方法。
int [] data; //宣告一個 int 陣列,命名為 data。(基本資料型態)
//此data不放到下一行裡面而在這獨立是因為可以讓本class 的其他方法也能使用。
void setData(int [] nums){ //void指此方法(叫做 setData)不須回傳資料。(返回值資料型態)
//後面的程式呼叫此方法,可接收一個整數陣列(nums)的資料。
data = nums; //將接收的整數陣列(nums)的資料,一個一個放到上面data 陣列裡。
}
int [] getData(){
return data;
}
int getMax(){ //宣告一個方法,命名為 getMax,用來算最大值。
int max = -1;
for (int i=0; i<data.length; i++){
//data.length從1開始,i 是從 0開始。所以要 <,不能 <=
if (data[i] > max){ //比大小
max = data[i]; //篡位
}
}
return max;
}
int getSum(){ //宣告一個方法,命名為 getSum,用來算加總。
int sum=0;
for (int i=0; i<data.length; i++){
sum = sum + data[i]; //算加總,一個一個將 data[i] 加到 sum。
}
return sum;
}
double getAvg(){ //宣告一個方法,命名為 getAvg,用來算平均值。
double avg = (double) getSum() / data.length; //要用 double 來顯示小數點
return avg;
}
}
public class E81 {
public static void main(String[] args) {
int [] scores ={22,57,80,50,60};
Compute c = new Compute();
c.setData(scores);
System.out.println("max="+c.getMax());
System.out.println("sum="+c.getSum());
System.out.println("avg="+c.getAvg());
}
}
結果
4.第九章 建構子
1. Public & Private
Public > Protected > Default > Private
2.建構子 (constructor)
程式碼
// 車子類別
class Car
{
private int num;
private double gas;
public Car() // 這是一個建構子之1,名稱必須與 class 相同。
{
num = 0;
gas = 0.0;
System.out.println("生產了車子。");
}
public Car(int n, double g) // 這是一個建構子之2,跟建構子之1的差別是參數型別不同。
// 前面2個建構子有相同的名字,但參數個數與型別不同,叫 overloading、重載、或同名異式。
{
num = n;
gas = g;
System.out.println("生產了車號為" + num + ",汽油量為" + gas + "的車子。");
}
public void show()
{
System.out.println("車號是" + num + "。");
System.out.println("汽油量是" + gas + "。");
}
}
class Sample5
{
public static void main(String[] args)
{
Car car1 = new Car(); //使用建構子之1
car1.show();
Car car2 = new Car(1234,25.0); //使用建構子之2
car2.show();
}
}
PS:利用建構子的好處是可以直接輸入參數值,不須再呼叫 setData。
比較:
有建構子
public Car(int n, double g) { //初始建構子之2
num = n;
gas = g;
System.out.println("生產了車號為" + num + ",汽油量為" + gas + "的車子。");
}
//使用建構子之2
Car car2 = new Car(1234,25.0); //new 完就可直接輸入參數
car2.show();
無建構子 (搭配陣列)
int [] data;
void setData(int [] nums){
data = nums;
}
//使用 setData
int [] scores ={22,57,80,50,60}; (三行)
Compute c = new Compute();
c.setData(scores); //new 完需要呼叫方法 setData 來塞入陣列 scores
若要改成有建構子
Compute (int [] nums){
data = nums;
}
//使用建構子 Compute
int [] scores ={22,57,80,50,60}; (二行)
Compute c = new Compute(scores); //new 完 可直接塞入陣列 scores
//直接將陣列 score 放入( ),不須再 new Compute然後呼叫 setData後再放入score
5.第九章 類別變數、物件變數
1.類別變數: eg: static int i;
2.類別方法: eg: static int getMax(int [] score) {
int max = -1;
return max;
}
PS:static 靜態的、類別的、共用的、系統自動 new 的。
3.物件變數:在class 內所宣告的變數,前面沒有 static修飾子。
4.物件方法:在class 內所宣告的方法,前面沒有 static修飾子。
PS:生產物件需要用 new ;物件內的變數是獨自使用,不可給第2物件用。
PS:Google 所得到的資訊
1. 靜態方法沒辦法用實體方法、實體變數
2. 實體變數才能儲存每個物件個別的資料
3. 所以如果沒有要用到每個物件個別的資料,就可以寫成靜態方法 (例如做一個該類別的物件數量計數器)
6.第十章 類別庫的使用
1.字串 String (參考課本P.226)
補充1:split() 切割
使用方法:
補充2:StringBuffer VS String的字串連接
StringBuffer:
預設會先使用16個位子加上我們給的字串長度來規劃記憶體。再用Append的功能,
加上第二次給的字串,所以效能較高。
String的字串連接:
str1 = str1 + str2
會先將原本的str1從記憶體中取出,與str2 做字串相加,再放到另一區塊的記憶體。
因為要做記憶體的取出、存入,所以效能比StringBuffer低。
2.數學 Math (參考課本P.234) --> 大量使用 static,例如:Math.PI、Math.E
3.Wrapper Class:八個基本資料型態的對應類別 (int; float,...)(參考課本P.233)
7.第十章練習 (Homework)
題目:假設字串: String str ="Hello World Java"
請將每個單字取出,並顯示在螢幕上
例如:
Hello
World
Java
Hint:方法有很多
第一用split;
第二用 charAt(i)配合 for迴圈及 if;
第三用 indexof()配合 substring()
程式碼
import java.util.Scanner;
public class Ch81 {
public static void main(String[] args) {
System.out.println("請輸入字串"); //設計成可自行輸入字串,增加彈性。
Scanner scan= new Scanner(System.in);
String str = scan.nextLine();
// String str = "Hello World Java"; (老師給的字串,若要用這行就將前三行去掉)
System.out.println("原字串: "+str);
String [] segment = str.split(" ");
//利用split"" 將輸入的字串用""(空格)分開,此例有2個空格,所以分三段。3
//因此 segment陣列就包含3個字串,編號為 0、1、2。
//System.out.println(segment[0]); 直接指定陣列的編號,較不彈性。
//System.out.println(segment[1]);
//System.out.println(segment[2]);
if (segment.length != 0){ //利用迴圈來抓取陣列編號,完全自動化處理。
for (int i=0; i<segment.length; i++){
System.out.println(segment[i]);
}
}
}
}
結果
JAVA 2 Basic part 5
1.複習昨天第七章
a.迴圈控制結構
1.for迴圈敘述
說明:
1.Java的for迴圈是一種簡化的while迴圈,可以執行固定次數的程式區塊
2.迴圈會自行處理計數器,讓計數器每一次增加或減少一個固定值
3.直到迴圈的結束條件成立為止
2.前測式的while迴圈敘述
說明:
1.例如:使用whilwhile迴圈敘述不同於for迴圈,我們需要在程式區塊自己處理計數器的增減
2.while迴圈是在程式區塊的開頭檢查結束條件,條件為true才允許進入迴圈執行
3.e迴圈計算階層5!的值,如下所示:
while ( level <= 5 ) {
n *= level;
System.out.println(level + "!=" + n);
level++;
}
3.後測式的do/while迴圈敘述
說明:
1.do/while和while迴圈敘述的差異是在迴圈結尾檢查結束條件
2.因此,do/while迴圈的程式區塊至少會執行一次。
3.例如:使用do/while迴圈顯示攝氏轉華氏的溫度轉換表,如下所示:
do {
f = (9.0 * c) / 5.0 + 32.0;
System.out.println(c + "\t" + f);
c += step;
} while ( c <= upper );
4.break和continue指令敘述
說明:
1.Java的break指令可以強迫終止迴圈執行
2.如同switch條件敘述使用break指令敘述跳出程式區塊一般,如下所示:
do {
System.out.print("|" + i);
total += i;
i++;
if ( i > 15 ) break;
} while ( true );
3.Java的continue指令是對應break指令,可以馬上繼續下一次迴圈的執行
4.不過,它並不會執行程式區塊位在continue指令敘述後的程式碼
5.如果使用在for迴圈,一樣更新計數器變數,如下所示:
for ( total = 0, i = 1; i <= 10; i++ ) {
if ( (i % 2) == 1 ) continue;
System.out.print("|" + i);
total += i;
2.類別方法
練習一
做一個可以求平均的類別方法:
程式碼
//利用陣列+類別方法,求平均值
public class E724 {
public static void main(String[] args) {
int [] num = {120,99,-5,168,333,280};
double d = getAvg(num);
System.out.println("平均="+d);
}
//此 getAvg(int[]) 可稱為一個API,使用範例如下:
public static double getAvg (int [] num) {
int sum =0;
for (int i=0; i<num.length; i++){
sum = sum + num[i];
}
double avg = (double) sum / num.length;
return avg;
}
}
練習二
點餐系統 用類別方法 將餐點獨立,再加上 for迴圈,並設定輸入999為結束。
程式碼
import java.io.*;
import java.util.Scanner;
class Sample61
{
static String [] menu = {"牛","羊","雞","豬","魚"};
//點餐主程式
public static void main(String[] args) throws IOException
{
int i=0;
for (; i!=999 ;){ //無窮迴圈,才可以持續點餐,輸入999表示離開
String msg1 = "請輸入數字 1~5,代表您要幾號餐。";
System.out.println(msg1);
Scanner scan = new Scanner(System.in);
i = scan.nextInt();
System.out.println( getMenu(i)); //呼叫getMenu副程式
}
System.out.println("Bye~"); //在迴圈外面,離開迴圈後只跑一次
}
//getMenu 副程式,可重複使用
public static String getMenu(int num){
String result="";
if (num==999) //若無此行,輸入999則會顯示"無此餐"後離開。利用此行傳回""。
result = "";
else if(num <1 || num >5) //排除 1~5 以外的錯誤輸入
result = "無此餐";
else
result = "你點的是"+menu[num-1];
return result;
}
}
結果
a.迴圈控制結構
1.for迴圈敘述
說明:
1.Java的for迴圈是一種簡化的while迴圈,可以執行固定次數的程式區塊
2.迴圈會自行處理計數器,讓計數器每一次增加或減少一個固定值
3.直到迴圈的結束條件成立為止
2.前測式的while迴圈敘述
說明:
1.例如:使用whilwhile迴圈敘述不同於for迴圈,我們需要在程式區塊自己處理計數器的增減
2.while迴圈是在程式區塊的開頭檢查結束條件,條件為true才允許進入迴圈執行
3.e迴圈計算階層5!的值,如下所示:
while ( level <= 5 ) {
n *= level;
System.out.println(level + "!=" + n);
level++;
}
3.後測式的do/while迴圈敘述
說明:
1.do/while和while迴圈敘述的差異是在迴圈結尾檢查結束條件
2.因此,do/while迴圈的程式區塊至少會執行一次。
3.例如:使用do/while迴圈顯示攝氏轉華氏的溫度轉換表,如下所示:
do {
f = (9.0 * c) / 5.0 + 32.0;
System.out.println(c + "\t" + f);
c += step;
} while ( c <= upper );
4.break和continue指令敘述
說明:
1.Java的break指令可以強迫終止迴圈執行
2.如同switch條件敘述使用break指令敘述跳出程式區塊一般,如下所示:
do {
System.out.print("|" + i);
total += i;
i++;
if ( i > 15 ) break;
} while ( true );
4.不過,它並不會執行程式區塊位在continue指令敘述後的程式碼
5.如果使用在for迴圈,一樣更新計數器變數,如下所示:
for ( total = 0, i = 1; i <= 10; i++ ) {
if ( (i % 2) == 1 ) continue;
System.out.print("|" + i);
total += i;
2.類別方法
練習一
做一個可以求平均的類別方法:
程式碼
//利用陣列+類別方法,求平均值
public class E724 {
public static void main(String[] args) {
int [] num = {120,99,-5,168,333,280};
double d = getAvg(num);
System.out.println("平均="+d);
}
//此 getAvg(int[]) 可稱為一個API,使用範例如下:
public static double getAvg (int [] num) {
int sum =0;
for (int i=0; i<num.length; i++){
sum = sum + num[i];
}
double avg = (double) sum / num.length;
return avg;
}
}
練習二
點餐系統 用類別方法 將餐點獨立,再加上 for迴圈,並設定輸入999為結束。
程式碼
import java.io.*;
import java.util.Scanner;
class Sample61
{
static String [] menu = {"牛","羊","雞","豬","魚"};
//點餐主程式
public static void main(String[] args) throws IOException
{
int i=0;
for (; i!=999 ;){ //無窮迴圈,才可以持續點餐,輸入999表示離開
String msg1 = "請輸入數字 1~5,代表您要幾號餐。";
System.out.println(msg1);
Scanner scan = new Scanner(System.in);
i = scan.nextInt();
System.out.println( getMenu(i)); //呼叫getMenu副程式
}
System.out.println("Bye~"); //在迴圈外面,離開迴圈後只跑一次
}
//getMenu 副程式,可重複使用
public static String getMenu(int num){
String result="";
if (num==999) //若無此行,輸入999則會顯示"無此餐"後離開。利用此行傳回""。
result = "";
else if(num <1 || num >5) //排除 1~5 以外的錯誤輸入
result = "無此餐";
else
result = "你點的是"+menu[num-1];
return result;
}
}
結果
Subscribe to:
Posts (Atom)
