Review
Java Primitive Type
Note:
- Java 從SE7 開始可以使用2 進位的表示法. 表示方法為 0b0011011011
- 浮點數就是帶有一個小數點, 記得一定要在數值的最右邊加上 F 或是 f
- Char 的前後必須以單引號 ' ' 表示, 最大宗的字元是使用 Unicode 來表示
*區域變數
(Local
Variable)
- 宣告在方法或是建構子或是static block 的變數都叫作區域變數
- 加上 final 後代表他是區域的常數
*成員變數
V.S
區域變數
- 成員變數
- 隨物件的建立, 被建立在HEAP Memory 中
- 建立時會依造型別指派初值
- 區域變數
- 隨方法的執行, 被建立在STACK Memory中
- 須由程式明確指派其初值
Notes:
- variable I might not have been initialized (變數未被初始化)
//Java程式範例:
TestLocalVar
public
class TestLocalVar {
public
static void main(String[] args) {
int
i,j=0;
if(j==0){
i=1;
}else
if(j!=0){ //如果把
if(j!=0)
去除掉就不會編譯失敗,
告訴電腦沒有別的結果
i=2;
}
System.out.println(i);
//編譯失敗
}
}
*指派(Assignment)
- 指派給別人會把自己的值複製一份再複製給別人
Notes:
- Control 的元件提供商業邏輯的運算
- Entity 的元件
Lab:
產品庫存報表
使用 Java
完成下列報表
產品庫存報表
------------------------------------------------
序號 品名
單價 免費 庫存量
------------------------------------------------
1.
可口可樂 12.0
false 10000
2.
iphone5 25000.0 false 10000
3.
4.
5.
------------------------------------------------
建立兩個檔案
Product.java
還有 TestProduct.java
Product.java
內容如下
public
class Product{
public
int id;
public
String name;
public
double unitPrice;
public
boolean free;
public
int stock;
public
String toString(){
//剛剛發生使用單引號來包覆
\t
產生與 id
相加的現象
return
id + "\t" + name + "\t" + unitPrice + "\t"
+ free + "\t" + stock;
}
}
TestProduct.java
內容如下
public
class TestProduct{
public
static void main(String[] args){
Product
p1 = new Product();
Product
p2 = new Product();
p1.id=1;
p1.name="可口可樂";
p1.unitPrice=12.0;
p1.free=false;
p1.stock=10000;
p2.id=2;
p2.name="百事可樂";
p2.unitPrice=10.0;
p2.free=false;
p2.stock=10000;
System.out.println("庫存報表");
System.out.println("------------------------------------------------");
System.out.println("序號\t品名\t\t單價\t免費\t庫存量");
System.out.println("------------------------------------------------");
System.out.println(p1);
System.out.println(p2);
System.out.println("------------------------------------------------");
}
}
其他的產品以此類推
– Take
Break –
*Chatper
4 方法的開發與使用
Notes:
- 業界會稱 Caller 為 Client Code
- Overloading (重載/超載/多載)
*為何要設計方法(Method)
- 可以定義反覆運作的行為程序
- 可以利用參數傳入外部資料
- 可定義回傳的型別, 傳出處理的結果
- 可以拋出例外狀況
Notes:
- 方法名稱 + 回傳型別 + 參數傳遞列 稱為方法簽章( Method Signature)
- 大括號內的內容稱為方法實作(Method Implementation)
- 只要回傳型別不是 void, 那方法的內部, 一定要有 return.
*Worker
與 Caller
- Worker
- 提供方法的定義與方法中的行為邏輯
- Ex: HelloService
- Caller
- 建立 Worker
- 呼叫方法並傳入參數值
- 得到回傳值
- Ex: TestHelloService
*重載方法
(Overloading
Method)
- 在類別中可以定義多個名稱相同的方法, 但是參數列必須不同 (必備條件)
- 參數列個數不同
- 參數個數相同, 但對應的資料型別不同
- 依造傳遞的參數來對應方法
- 允許回傳型別還有存取控制可以不一樣 (OverLoading 只判斷方法的名稱還有參數列的個數, 不管前面的回傳型別(void / String / int … ) 或是存取控制 (public / protected … ) )
*this
關鍵字
- 為了要保護參數的設定將存取的控制改成 private. 要提供適當的 Setter 與 Getter, 透過this 解決名稱衝突的問題.
- 把物件自己當作參數傳遞給其他方法或建構子
public
class Pruduct{
private
int id;
private
double unitPrice;
//getter
取得的方法
public
int getId(){
return
id;
}
//setter
設定的方法
public
void setId(int id){
//為了解決名稱衝突的問題
//原來為id
= id
//可以於方法內設定檢查邏輯,
避免用戶端設定錯誤的參數
this.id
= id; //this 會指向 private
那個id
}
}
Lab:
修改 Product
Class
Notes:
- 類別圖上面的符號 +代表 public, - 代表 private
- boolean 值的時候 Get 與 Set 會是 is 與 Set, 而不是使用 get 與 set這樣的名稱
修改
Product.java
public
class Product{
private
int id;
private
String name;
private
double unitPrice;
private
boolean free;
private
int stock;
//id
public
int getId(){
return
this.id; //這邊忘記使用
this.id
}
public
void setId(int id){ //注意
set的時候不需要回傳
this.id
= id;
}
//name
public
String getName(){
return
this.name;
}
public
void setName(String name){
this.name
= name;
}
//unitPrice
public
double getUnitPrice(){
return
this.unitPrice;
}
public
void setUnitPrice(double unitPrice){
this.unitPrice
= unitPrice;
}
//free
public
boolean isFree(){
return
this.free;
}
public
void setFree(boolean free){
this.free
= free;
}
//stock
public
int getStock(){
return
this.stock;
}
public
void incStock(int amount){
//stock
= stock + amount;
this.stock
+= amount;
}
public
void decStock(int amount){
this.stock
-= amount;
}
public
String toString(){
//剛剛發生使用單引號來包覆
\t
產生與 id
相加的現象
return
id + "\t" + name + "\t" + unitPrice + "\t"
+ free + "\t" + stock;
}
}
修改
TestProduct.java
public
class TestProduct{
public
static void main(String[] args){
Product
p1 = new Product();
//當改成
private
之後,忘記如何去存取
Product.java
內的方法
p1.setId(1);
//使用方法呼叫
前面加上方法名稱,傳遞參數進去
p1.setName("可口可樂");
p1.setUnitPrice(12.0);
p1.setFree(false);
p1.incStock(10000);
Product
p2 = new Product();
p2.setId(2);
p2.setName("百事可樂");
p2.setUnitPrice(10.0);
p2.setFree(false);
p2.incStock(10000);
/*
原來的寫法 p1.id=1;
p1.name="可口可樂";
p1.unitPrice=12.0;
p1.free=false;
p1.stock=10000;
p2.id=2;
p2.name="百事可樂";
p2.unitPrice=10.0;
p2.free=false;
p2.stock=10000;
*/
//庫存價值
double
totalInventory = 0.0;
ProductService
ps = new ProductService();
//逐項將各品項相加
totalInventory
+= ps.calcProductInventory(p1);
totalInventory
+= ps.calcProductInventory(p2);
System.out.println("庫存報表");
System.out.println("------------------------------------------------");
System.out.println("序號\t品名\t\t單價\t免費\t庫存量\t\t庫存價值");
System.out.println("------------------------------------------------");
System.out.println(p1+"\t"+ps.calcProductInventory(p1));
System.out.println(p2+"\t"+ps.calcProductInventory(p2));
System.out.println("------------------------------------------------");
System.out.println("\t\t\t\t
庫存價值=
"+totalInventory);
System.out.println("------------------------------------------------");
}
}
建立一個 ProductService.java
來算單項產品目前的總價值
public
class ProductService{
public
double calcProductInventory(Product product){
return
product.getUnitPrice()*product.getStock();
}
}
*Chapter
5 物件的建立與使用
Notes:
- Java 傳參數都是 pass by value
*建構子(Constructor)
- 常在這裡指派成員變數的初值
- 每個類別至少要有一個建構子
- 如果沒有定義建構子, java 會自行建立預設建構子(不傳參數, 內容為空白)
- 建構子的名稱與類別名稱完全相同
- 建構子不可以宣告回傳型別
- 建構子不會被繼承
- 建構子也可以Overloading
- 建構子透過 this() 來傳參數, 目的是為了呼叫同一類別的其他建構子, 這樣的程式必須放在建構子內有效程式碼的第一行