星期三, 10月 03, 2012

OCPJP Day 6


Lab: 判斷奇數還是偶數

新增一個 IfEvenOrOdd 的類別

package mod07;

public class IfEvenOrOdd {
public static void main(String[] args){
int num = Integer.parseInt(args[0]);
if(num%2 == 0) //判斷除以2後的餘數是否等於 0
{
System.out.println(num+" is 偶數");
}
else
{
System.out.println(num+" is 奇數");
}
}
}

Notes:
  • 這邊有注意到 Netbeans 會把編譯後的class放在專案目錄下的 build/clesses 資料夾, 所以如果要執行這個範例就要在 clesses 資料夾下 java mod07/IfEvenOrOdd 111


*for迴圈
  • 常用在次數確定的迴圈, 是一種 0 到多的迴圈
  • 語法: for( [初始化] ; [條件式] ; [後處理] )
    • ; 為分隔符號
    • 初始化只會執行一次
    • 如果滿足條件式就會進行後處理

Lab: for 迴圈

package mod07;

public class TestForLoop {

public static void main(String[] args) {
int i = 0; //為了證明 for 迴圈的初始化是optional 還有想要知道 I 在第幾個值跳出來, 在這邊宣告
for ( ; i < 10; i++) { //第一個欄位沒有填
System.out.println("Hello"+i);
}
System.out.println("i = "+i); //列出 i 的值
}
}

Notes:
  • 可以藉由去修改專案的屬性 (File → Project Properties 內的 Run) 去填入不同的arguments, 這樣就未必一定要到終端機下去下引數.


*while 迴圈
  • 迴圈次數不確定時常用的方式, 是一種 0 到多的迴圈
  • 語法 while ( boolean 運算式 ) { }

Lab: while

package mod07;

public class TestWhileLoop {

public static void main(String[] args) {
// TODO code application logic here
int i = 0;
while (i < 10){
System.out.println("Hello "+ i);
i++;
}
System.out.println("i = "+i);
}
}

Take Break 15 mins –

*do … while 迴圈
  • 無論如何會執行一次, 1 到多的迴圈
  • 語法 do { } while (boolean 運算式);
    • 記得結束要有 ; 分號


Lab: do … while

package mod07;

public class TestDoWhileLoop {

public static void main(String[] args) {
int i = 0; //宣告 i = 0 初始化
do{
//至少會執行一次 at least run one time
System.out.println("Hello "+i);
i++;
}while(i < 10); //i 小於10 就執行
System.out.println("i = "+i);
}
}



*break, continue, label
  • 控制迴圈的手段
  • break 終止迴圈的執行
  • continue暫停目前的迴圈, 提早進入下一個迴圈的判斷式


說明 break
do{
statement1;
if (a > 10){
break; // 因為是 break 所以會終止目前的迴圈, 跳到 statement 3
}
statement2;
} while ( b > 10 );
statement3;

說明 continue

do{
statement1;
if (a > 10){
continue; //因為是 continue, 所以會繼續下一回合的邏輯判斷 while(b > 10)
}
statement2;
} while ( b > 10 );
statement3;

說明 label

outer: //這個是 label
do{
statement1;
do{
statement2;
if(a > 10) {
break Outer; //指定 break Outer 所以跳出 Outer , 執行 statement 5
}
statement3;
} while (b > 10);
statement4;
} while ( c > 10);
statement 5;

說明 label

outer: //這個是 label
do{
statement1;
do{
statement2;
if(a > 10) {
continue Outer; //指定 continue Outer 執行 Outer 判斷 while( c> 10)
}
statement3;
} while (b > 10);
statement4;
} while ( c > 10);
statement 5;


Lab: 九九乘法表

package mod07;

public class ForMultiTable {

public static void main(String[] args) {
for( int i = 1; i <= 9; i++){
for(int j=1; j <= 9; j++){
System.out.print(i+"*"+j+"="+(i*j)+"\t"); //若要排列整齊, 使用 tab的方式
}
System.out.println();
}
// for 三角形列出
for( int i = 1; i <= 9; i++){
for(int j=1; j <= i; j++){
System.out.print(i+"*"+j+"="+((i*j<10)?" ":"")+(i*j)=" "); //若要排列整齊另一種方式
}
System.out.println();
}
}
}



*Chapter 8 封裝概論

Notes:
  • 藉由封裝來釐清責任歸屬

*存取物件的成員
  • 用點符號來存取
  • 這種方式可以用來存取物件的成員, 包含屬性和方法

*public 存取控制關鍵字
  • 類別圖的 + 代表 public
  • 表示該物件成員可由類別外部直接存取

Notes:
  • 如果使用屬性的方式來修改
    • 缺點:
      • 必須將資料驗證放在用戶端程式(client code)
      • 程式碼散落各用戶端程式
      • 程式碼可能不一致
      • 維護性大幅降低
  • 所以修改使用方法的方式比修改屬性來的好
    • 驗證程式碼統一集中於方法內
    • 方法內部可修改不同的實作而不影響用戶程式碼 (前提為: 方法簽章(方法名稱, 資料型別, 參數列)必須保持固定不變[操作存取介面])


*private 存取控制
  • 類別圖的 - 代表 public
  • 表示該物件成員只能由類別內部存取, 而不能由類別外部存取
  • 透過方法來存取物件屬性

*getter and setter 方法
  • 透過 getter setter 方法來存取 private 屬性

*封裝
  • 將類別的實作細節(屬性, 方法內部的實作)隱藏起來
  • 迫使用戶端透過公開的介面來存取物件的資料

沒有留言: