星期三, 9月 26, 2012

OCPJP Class Day 3


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() 來傳參數, 目的是為了呼叫同一類別的其他建構子, 這樣的程式必須放在建構子內有效程式碼的第一行



星期六, 9月 22, 2012

OCPJP Class Day2


Chapter 2 Java 的類別

類別分成兩大類
  • 可執行
  • 不能執行

Notes:
  • 類別如果是公開, 那檔名就要跟類別名稱一樣
  • void 代表沒有回傳值

Lab: Hello.java

新增mod02資料夾在 SCJP\exercise 目錄內
新增Hello.java SCJP\exercise\mod02
輸入以下程式碼

//Executable Java Class
public class Hello{

public static void main(String[] args){
System.out.println("Hello world");
}
}

使用命令提示字元在該目錄
> javac Hello.java
> java Hello


Lab: 不可執行的 java 程式

// Non-executable Java Class
public class Greeting{
public void sayHello(String name){
System.out.println("Hello, "+name);
}
}

建立 Greeting.java
嘗試編譯以及執行
> javac Greeting.java
> java Greeting

Notes:
  • + 代表字串串接





Lab:

修改 Hello.java

//Executable Java Class
public class Hello{

public static void main(String[] args){
System.out.println("Hello world");
Greeting x = new Greeting(); //建構物件
x.sayHello("Max"); //使用物件
}
}

使用命令提示字元
> javac Hello.java
> java Hello

Notes:
  • 被主程式利用到的類別, 編譯的時候會順便編譯他

Notes:
  • 檔案中可以定義一到多個類別
  • 最多可以有一個public class, 且檔名必須與類別名稱相同. (如果檔案內沒有 public class 檔案名稱就沒有強制規定)
  • 編譯的時候呼叫的是檔案的名稱, 執行的時候是呼叫類別的名稱(區分大小寫)
  • 類別
    • 定義同一類型的不同物件之間共同的資料結構(屬性)[靜態]與行為邏輯(方法)[動態]
    • 好比建築物的藍圖
    • 可以
      • 屬性
      • 方法
      • 定義建構子
      • 定義巢狀類別
  • 物件(Object)
    • 將類別建立成實體就是物件
    • 物件就像依據藍圖完成的建築物
    • 同一類別所建立的各個物件
      • 各自獨立
      • 擁有各自獨立的屬性狀態值
      • 擁有來自同一類別方法中相同的行為邏輯

*Java class的語法

< > - non-terminal
[ ] - optional


*Java 類別設計示範


Lab: 繪製 UML

安裝 JUDE 程式 ( 可以繪製 UML)
http://jude.change-vision.com/jude-web/product/community.html
目前 JUDE 停止開發
有新的專案 astah

新增 Class Diagram (參考課本)
新增類別圖
  • 類別名稱 Employee
  • 屬性 ( 滑鼠右鍵Add Attribute 或是 Ctrl + F )
  • 方法 ( 滑鼠右鍵Add Operation 或是 Ctrl + M)


Lab: 使用JUDE 來進行正向工程 / 逆向工程

正向工程(Forward Engineering) – UML 轉換成程式

將剛剛繪製的類別圖轉成 java
Tool → Java → Export Java

觀察輸出的 Employee.java

逆向工程(Reverse Engineering) – 從程式轉換成UML

Tool → Java → import Java



Lab:

JUDE 不知道如何定義方法, 參考 課本補上方法

public class Employee{
public String name;
public String title;
public String department;
public int salary;
//定義方法
public String toString(){
return name + "\n" + title + "\n" + department + "\n" + salary;
}

}

新增一個 TestEmployee.java

public class TestEmployee{
public static void main(String[] args){
Employee emp1 = new Employee();
emp1.name="Max";
emp1.title="Manager";
emp1.department="IT";
emp1.salary=85000;
System.out.println(emp1);
}
}


編譯 Employee 以及 TestEmployee 並執行
> javac Employee.java
> javac TestEmployee.java
> java TestEmployee

*識別子(Identifier)的命令規則
  • 使用 unicode 開頭的文字, 或是 _ 或是 $ 兩個符號
  • 識別字不可以用數字開頭, 第二個字可以是文字, 數字, 或是 _ 或是 $ 兩個符號
  • 不可以是 java 關鍵字(目前有 50 個關鍵字)
  • 大小寫有別, 沒有長度上限

*java 關鍵字

  • true, false, null 不是關鍵字
  • transient, volatile, strictfp, native 不會考

*識別子的命名慣例 (Naming Convention)

  • 套件(Package): 以小寫英文命名, 習慣以公司名稱反過來取
  • 類別(Class), 介面(Interface), 和列舉型別(enum): 應為名詞或是名詞片語
  • 方法(Method): 開頭應用動詞
  • 區域變數: 應該簡短有意義.
  • 成員變數: 第一個字母應該小寫, 也可以混合使用, 限制底線 _ 的使用
  • 常數: 建議全部大寫, 以底線斷詞.


*Chapter 3 java的變數與型別

*成員變數(Member Variable)
  • 宣告在類別中(但不是在方法或建構子)的變數就稱為成員變數


public class Scoping{
public static int a; //類別變數(class variable) 會自動初始化(自動歸零)
public int b; //成員變數(Member variable) 或是 實體變數(Instance variable) 會自動初始化
public final int MYCONST=100; //常數 不會自動初始化

public void oops(int c, int d){
int e;
if( c > 10){
int f;
System.out.println( );
}
System.out.println( );
}
}
Notes:
  • 以上 c, d, e, f 都是區域變數 (因為在方法裡面), c d 會由呼叫者傳入初值, e, f 為方法本體內所宣告的區域變數, 不會自動初始化. 所以 e, f 在使用前必須先行初始化(要指派值, 不然會發生 NullPoint exception).
  • 大括號會限制變數的有效範圍
  • java 的變數可以先宣告後給值, 建議一行宣告一個變數.

*java的基本資料型別(Primitive Type)

基本型別
(Primitive Type)
邏輯
boolean

Boolean b = true;
文字
char
16 bits
char c = 'A'; 'a' '\n' '\ucafe' '\ubabe'
整數
byte
8 bits
byte b = 5;
short
16 bits
short s = 15;
int
32 bits
int i =25;
long
64 bits
long x = 35L;
浮點
float
32 bits
float f = 543.21F;
double
64 bits
double d = 123.45;
參考型別
(Reference Type)
Greeting g = new Greeting();
Employee e = new Employee();
Customer c = new Customer();

Notes:
  • Java boolean不可以將 0 false, 1true, 一定要給 true 或是 false.
  • 文字有三種表示法
    • 可以直接輸入
    • 跳脫字元
    • 16進位碼
  • 使用long的時候會在後面加上大寫或是小寫的L
  • int 是預設的整數型別
  • overload 相同的方法名稱, 可以接受不同的型別(參數).
  • double 是預設的實數型別
  • Java 碰到 float 要特別小心. 一定要在數字的右方加上大寫的F. (有可能喪失數值的精確度, 沒有加上F 預設浮點的大小會給 64 bits, 但是前面宣告 float 就會被截斷,放到 32 bits )
  • 只要是類別就是參考型別
  • Java 只是廢除指標運算. 不是廢除指標.