星期一, 10月 01, 2012

OCPJP Day 5


*建立JAR檔案
  • .class檔案依造宣告的package,使用GZIP 格式壓縮, 並指定副檔名為.jar
  • 設定manifest.mf檔案內容(專案目錄中建立meta-inf的目錄, 並在目錄內設定)
    • Main-Class
      • Main-Class: com.max.main.Hello
      • Main-Class: 後面要空格
    • Class-Path

Lab:

建立一個檔案 abc.txt 當成manifest.mf 內容如下 (Hello後面要換行)
Main-Class: com.max.main.Hello

在類別的最上層目錄下指令(com的上一層), 目前該目錄下有 abc.txt 以及 com 目錄
abc.txt com

jar cvfm test.jar abc.txt .
  • test.jar 為輸出的 jar檔案名稱
  • abc.txt manifest.mf 檔案
  • . 代表目前的目錄, windows 實作上差了一個目錄層級, linux上製作是在現行目錄下

測試建立的 .jar 檔案

java -jar test.jar


*設定classpath
  • 可以在編譯或執行的時候加上 -classpath設定指定JRE以外的類別程式庫
  • 或是加上CLASSPATH環境變數
  • 或是在JAR檔案中的mainifest.mf內容加上Class-Path的設定


Lab: Netbeans

執行 Netbeans
(發現沒有專案, 原來在linux底下不是只裝 netbeans 就好了, 要裝 netbeans-java …. )
以後專案放在SCJP/exercise 下面
Netbeans 下建立一個專案測試

Tips 組合鍵
  • Tab 用來展開 Code Template
    • 例如 sout 然後按 tab 按鍵
  • Crtl + Space 程式碼的輔助功能
  • Shift + F6 Run File

Libraries 上面 可以使用 滑鼠右鍵 Add JAR / Folder 來新增 函式庫

Notes:
  • eclipse 內使用 Alt + / 可以達到 Tab or Ctrl + Space 的效果


*Chapter 6 運算子與運算式

*基本型別的提升
  • = 將右邊的結果指派給左邊的變數
    • 變數名稱=| 另一個變數 | 運算式 | 方法的回傳結果
  • 指派時, 若等號左邊的型別大於右邊的時候, 指派成功稱為提升(Promotion)
    • byte –> short -> char -> int -> long -> float -> double


*基本型別的轉型
  • 指派時, 若等號左邊的型別於右邊的時候, 則需要將右邊的資料轉型(Casting), 否則會出現編譯錯誤
  • possible loss of precision (可能會失去精確度)


*運算子(Operator)

Notes:
  • 位元運算子:先轉成2進位再運算

*算術(Arithmetic)運算子與計算式
  • 提供數字元素的常用計算功能: + - * / %
  • Java 運算的最小的型別是int (元素型別小於int 都會被提升為 int [例如 byte/short/char])
  • Java 算術運算式結果的型別不是依造執行時期實際計算結果來決定, 不是依照等號左邊的型別來決定, 而是根據運算式中所參與的運算元的型別來決定.
    • 例如 byte a=1, b=1, c=a+b;
    • 上述的 a, b, c 都是 byte 型別, 但是 a+b 是運算式, 所以就會被提升為int
    • 也就是 byte c = int a + int b //這樣會有編譯錯誤, 因為喪失精確度
    • 這樣會喪失精確度 possible loss of precision
    • 所以要進行轉型的動作, 才不會喪失精確度
    • 結果要寫成 byte c = (byte) (a+b)

Break –

*遞增/遞減 運算子
  • 放在右邊就是後置
    • 先輸出後遞增 a++
  • 放在左邊就是前置
    • 先遞增後輸出 ++a



*邏輯(Logical)運算子
  • && || Short-cut 運算子, 一般放在兩個運算式之間.
    • 算式1 && 算式2
      • 算式1 為真才會執行算式2
    • 算式1 || 算式2
      • 算式1 為假才會執行算式2

*位移運算子
  • 將整數轉為2進位, 然後將資料向左或是向右位移
  • java 用第一個 bit 來代表 + 或是 -
  • 32 << 2
    • 32 * 22次方 = 32 * 4 = 128
  • 右移分為保留正負號(Right-shift) 以及 不保留正負號(Unsigned Right-shift)(一律都補上0)


*字串運算子
  • 物件跟字串串接, java 會自動呼叫他們的toString()
  • 任何型別的資料與字串相加時, 都會先轉為字串
  • 加號是從左到右取值

例如
System.out.println(111+222+333); //裏面沒有字串所以作數學運算
System.out.println("111"+222+333); //裏面有字串, 所以先轉成字串,後面的 222+333就不會運算
System.out.println(111+"222"+333); //裏面有字串, 所以先轉成字串
System.out.println(111+222+"333"); //由於加號是從左到右, 還沒碰到字串,所以會先進行 111+222 在列出333

輸出結果為

666
111222333
111222333
333333

Lab : java 運算子

int i = 1;
System.out.println("i="+i);
System.out.println("before i++");
System.out.println("Do i++ and i="+i++);
System.out.println("after i++");
System.out.println("i="+i);
System.out.println("Do --i");
System.out.println("i="+--i);
i = 128 ^ 5;
// 128 = 10000000
// 5 = 00000101
//進行互斥運算 10000101
System.out.println(i);
i >>=3;
System.out.println(i);


*Chapter 7 決策判斷與迴圈結構

* if … else
  • if 的語法不一定要搭配 else
  • java 沒有then 關鍵字

*if … else if … else
  • else if 的數量沒有限制

*switch … case
  • switch 可以接受
    • int 的相容型別(byte/char/short/int)
    • enum
    • String (Java SE 7.0 後面才開始支援)
  • case 可以有 0 到多個
  • default case 比對不到就會跑到 default
  • break 用來跳出 switch, 如果沒有 break 就會往下執行

例如

int type = 1;
switch(type) {
case 1:
System.out.println("A");
System.out.println("B");
System.out.println("C");
System.out.println("D");
System.out.println("E");

break; // jump out
case 2:
System.out.println("A");
System.out.println("B");
System.out.println("C");
System.out.println("D");

break;
case 3:
System.out.println("A");
System.out.println("B");
System.out.println("C");
break;
default:
System.out.println("A");
System.out.println("B");
break;
}
以上的作法每一個case 的順序不會影響後面的結果, 但是會有很多重複的部份.

也可以改成

int type = 1;
switch(type) {
case 1:
System.out.println("A");

case 2:
System.out.println("B");

case 3:
System.out.println("C");

default:
System.out.println("D");
System.out.println("E");
}

但是用以上的方式, case 排列的順序就很重要, 沒有break 程序會一直往下執行

上面的 int type = 1; 也可以換成
int type = Integer.parseInt(args[0]); //Just can use it for command line to receive

沒有留言: