顯示具有 練習 標籤的文章。 顯示所有文章
顯示具有 練習 標籤的文章。 顯示所有文章

2014年4月17日 星期四

練習 8

續練習7. 設計一個活期存款教易帳戶 UI, 畫面上有 Label 元件 (銀行帳號 , 存入金額) 以及 TextField, 另外有一個確認按鈕 Button, 按下時顯示"交易完成" http://download.eclipse.org/windowbuilder/WB/release/R201309271200/4.2/

2014年4月10日 星期四

練習 7: 多執行緒

續練習 6。現今有 3 個人共用一本活期存款的賬戶,而於同一個時間分別存入 500元、 1000元、 2000元,請顯示餘額 檔案:ATM.java
package bank2;

public class ATM extends Thread {
 DemandDepositAccount account;
 int money;
 
 public ATM(DemandDepositAccount account, int money){
  this.account = account;
  this.money = money;
 }
 
 public void run(){
  try {
   account.deposit(money);
  } catch (AccountException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

}


檔案:Account.java
package bank2;

public abstract class Account {
 int balance;
 Account(int money) {
   balance = money;
 }
 public abstract int inquiry();
}


檔案:AccountException.java
package bank2;

public class AccountException extends Exception {
  
 public String getMessage() // 覆寫 Throwable 的 toString()
 {
  return "金額不可以為負數";
 }
 
 public void showMessage() { // 自定方法
  System.out.println("例外發生:請從新輸入金額");
 }
}


檔案:DemandDepositAccount.java
package bank2;

public class DemandDepositAccount extends Account {
 
 DemandDepositAccount(int money){
  super(money);
 }
 
 public synchronized void deposit(int money) throws AccountException {
  if (money < 0) {
   throw new AccountException();
  }
  else {
   balance += money;
   System.out.println("money: " +balance);
  }
 }
 
 public void withdraw(int money) throws AccountException{
  if (money < 0)
   throw new AccountException();
  else
   balance -= money;
 }

 public int inquiry() {
  return balance;
 }
}


檔案:FixedDepositAccount.java
package bank2;

public class FixedDepositAccount extends Account {

 FixedDepositAccount(int money) {
  super(money);
  try{
    if (money < 50000)
     throw new ArithmeticException("例外狀況:定期存款最少需 50,000 元");
  }catch(Exception e){
     System.out.println(e.toString());
  }
 }

 public FixedDepositAccount() {
  // TODO Auto-generated constructor stub
  super(50000);
 }

 @Override
 public int inquiry() {
  // TODO Auto-generated method stub
  (new FixedDepositAccount() {
   public void showMe(){
    System.out.println("本銀行定額存款10萬以上,另有優惠,請多加利用");
   }
  }).showMe();
  
  return balance;
 }
}


檔案:AccountTest.java
package bank2;

public class AccountTest {

 public static void main(String[] args) {

   DemandDepositAccount account1 = new DemandDepositAccount(1000);
   ATM A1 = new ATM(account1, 500);
   ATM A2 = new ATM(account1, 1000);
   ATM A3 = new ATM(account1, 2000);
   A1.start();
   A2.start();
   A3.start();
 }

}
執行結果













若 deposit ()這方法不用 synchronized 這修飾字時,會有不正常的顯示

2014年4月9日 星期三

練習 6:多型

續練習 5。若某客戶同時擁有活期帳戶與定期存款帳戶,而要同時查詢帳戶餘額。試以多型實作

檔案:Account.java
package bank2;

public abstract class Account {
 int balance;
 Account(int money) {
   balance = money;
 }
 public abstract int inquiry();
}


檔案:AccountException.java
package bank2;

public class AccountException extends Exception {
  
 public String getMessage() // 覆寫 Throwable 的 toString()
 {
  return "金額不可以為負數";
 }
 
 public void showMessage() { // 自定方法
  System.out.println("例外發生:請從新輸入金額");
 }
}


檔案:DemandDepositAccount.java
package bank2;

public class DemandDepositAccount extends Account {
 
 DemandDepositAccount(int money){
  super(money);
 }
 
 public void deposit(int money) throws AccountException {
  if (money < 0) {
   throw new AccountException();
  }
  else
   balance += money;
 }
 
 public void withdraw(int money) throws AccountException{
  if (money < 0)
   throw new AccountException();
  else
   balance -= money;
 }

 public int inquiry() {
  return balance;
 }
}


檔案:FixedDepositAccount.java
package bank2;

public class FixedDepositAccount extends Account {

 FixedDepositAccount(int money) {
  super(money);
  try{
    if (money < 50000)
     throw new ArithmeticException("例外狀況:定期存款最少需 50,000 元");
  }catch(Exception e){
     System.out.println(e.toString());
  }
 }

 public FixedDepositAccount() {
  // TODO Auto-generated constructor stub
  super(50000);
 }

 @Override
 public int inquiry() {
  // TODO Auto-generated method stub
  (new FixedDepositAccount() {
   public void showMe(){
    System.out.println("本銀行定額存款10萬以上,另有優惠,請多加利用");
   }
  }).showMe();
  
  return balance;
 }
}


檔案:AccountTest.java
package bank2;

public class AccountTest {

 public static void main(String[] args) {

  try{
   DemandDepositAccount demandDepositAcc = new DemandDepositAccount(1000);
   demandDepositAcc.deposit(500);
   demandDepositAcc.withdraw(300);
   System.out.println("活期賬戶餘額:" + demandDepositAcc.inquiry());
   
   FixedDepositAccount fixedDepositAcc = new FixedDepositAccount(20000);   
   System.out.println("定期賬戶餘額:" + fixedDepositAcc.inquiry());

   Account account = demandDepositAcc;
   System.out.println("活期賬戶餘額2:" + account.inquiry());
   account = fixedDepositAcc;
   System.out.println("定期賬戶餘額2:" + account.inquiry());
   
  }
  catch(AccountException e){
   System.out.println(e.toString());
   e.showMessage();
  } 
 }

}
執行結果








當然,可以將此測試檔案改寫為

檔案:AccountTest.java
package bank2;

public class AccountTest {

 public static void main(String[] args) {

  try{
   Account account = new DemandDepositAccount(1000);
   ((DemandDepositAccount) account).deposit(500);
   ((DemandDepositAccount) account).withdraw(300);
   System.out.println("活期賬戶餘額2:" + account.inquiry());
   
   account = new FixedDepositAccount(50000);
   System.out.println("定期賬戶餘額2:" + account.inquiry());  
  }
  catch(AccountException e){
   System.out.println(e.toString());
   e.showMessage();
  } 
 }

}
執行結果

練習 5: 例外,以 throw new 實作

續練習4: 銀行更改定期帳戶的開戶條件,凡開戶時金額小於 50,000元以下時,系統自動顯示例外訊息。 提示:以 throw new 類別實作

檔案:Account.java
package bank2;

public abstract class Account {
 int balance;
 Account(int money) {
   balance = money;
 }
 public abstract int inquiry();
}


檔案:AccountException.java
package bank2;

public class AccountException extends Exception {
  
 public String getMessage() // 覆寫 Throwable 的 toString()
 {
  return "金額不可以為負數";
 }
 
 public void showMessage() { // 自定方法
  System.out.println("例外發生:請從新輸入金額");
 }
}


檔案:DemandDepositAccount.java
package bank2;

public class DemandDepositAccount extends Account {
 
 DemandDepositAccount(int money){
  super(money);
 }
 
 public void deposit(int money) throws AccountException {
  if (money < 0) {
   throw new AccountException();
  }
  else
   balance += money;
 }
 
 public void withdraw(int money) throws AccountException{
  if (money < 0)
   throw new AccountException();
  else
   balance -= money;
 }

 public int inquiry() {
  return balance;
 }
}


檔案:FixedDepositAccount.java
package bank2;

public class FixedDepositAccount extends Account {

 FixedDepositAccount(int money) {
  super(money);
  if (money < 50000)
   throw new ArithmeticException("例外狀況:定期存款最少需 50,000 元");
 }

 public FixedDepositAccount() {
  super(50000);
 }

 @Override
 public int inquiry() {
  // TODO Auto-generated method stub
  (new FixedDepositAccount() {
   public void showMe(){
    System.out.println("本銀行定額存款10萬以上,另有優惠,請多加利用");
   }
  }).showMe();
  
  return balance;
 }
}


檔案:AccountTest.java
package bank2;

public class AccountTest {

 public static void main(String[] args) {

  try{
   DemandDepositAccount demandDepositAcc = new DemandDepositAccount(1000);
   demandDepositAcc.deposit(500);
   demandDepositAcc.withdraw(300);
   System.out.println("活期賬戶餘額:" + demandDepositAcc.inquiry());
   
   FixedDepositAccount fixedDepositAcc = new FixedDepositAccount(20000);   
   System.out.println("定期賬戶餘額:" + fixedDepositAcc.inquiry());
   
  }
  catch(AccountException e){
   System.out.println(e.toString());
   e.showMessage();
  } 
 }

}
執行結果










我們也可改寫 檔案:FixedDepositAccount.java
package bank2;

public class FixedDepositAccount extends Account {

 FixedDepositAccount(int money) {
  super(money);
  try{
    if (money < 50000)
     throw new ArithmeticException("例外狀況:定期存款最少需 50,000 元");
  }catch(Exception e){
     System.out.println(e.toString());
  }
 }

 public FixedDepositAccount() {
  // TODO Auto-generated constructor stub
  super(50000);
 }

 @Override
 public int inquiry() {
  // TODO Auto-generated method stub
  (new FixedDepositAccount() {
   public void showMe(){
    System.out.println("本銀行定額存款10萬以上,另有優惠,請多加利用");
   }
  }).showMe();
  
  return balance;
 }
}
執行結果

練習 4: 匿名類別

續練習3: 銀行臨時舉行促銷活動,凡定期存款客戶查詢帳號餘額時,會告知客戶,而顯示「本銀行定額存款10萬以上,另有優惠,請多加利用」訊息。 提示:在查詢時,以匿名類別實作

檔案:Account.java
package bank2;

public abstract class Account {
 int balance;
 Account(int money) {
   balance = money;
 }
 public abstract int inquiry();
}


檔案:AccountException.java
package bank2;

public class AccountException extends Exception {
  
 public String getMessage() // 覆寫 Throwable 的 toString()
 {
  return "金額不可以為負數";
 }
 
 public void showMessage() { // 自定方法
  System.out.println("例外發生:請從新輸入金額");
 }
}


檔案:DemandDepositAccount.java
package bank2;

public class DemandDepositAccount extends Account {
 
 DemandDepositAccount(int money){
  super(money);
 }
 
 public void deposit(int money) throws AccountException {
  if (money < 0) {
   throw new AccountException();
  }
  else
   balance += money;
 }
 
 public void withdraw(int money) throws AccountException{
  if (money < 0)
   throw new AccountException();
  else
   balance -= money;
 }

 public int inquiry() {
  return balance;
 }
}


檔案:FixedDepositAccount.java
package bank2;

public class FixedDepositAccount extends Account {

 FixedDepositAccount(int money) {
  super(money);
  // TODO Auto-generated constructor stub
 }

 public FixedDepositAccount() {
  // TODO Auto-generated constructor stub
  super(50000);
 }

 @Override
 public int inquiry() {
  // TODO Auto-generated method stub
  (new FixedDepositAccount() {
   public void showMe(){
    System.out.println("本銀行定額存款10萬以上,另有優惠,請多加利用");
   }
  }).showMe();
  
  return balance;
 }
}


檔案:AccountTest.java
package bank2;

public class AccountTest {

 public static void main(String[] args) {

  try{
   DemandDepositAccount demandDepositAcc = new DemandDepositAccount(1000);
   demandDepositAcc.deposit(500);
   demandDepositAcc.withdraw(300);
   System.out.println("活期賬戶餘額:" + demandDepositAcc.inquiry());
   
   FixedDepositAccount fixedDepositAcc = new FixedDepositAccount(20000);   
   System.out.println("定期賬戶餘額:" + fixedDepositAcc.inquiry());
   
  }
  catch(AccountException e){
   System.out.println(e.toString());
   e.showMessage();
  } 
 }

}
執行結果

練習 3 : 例外處理

續練習 2。在活期賬戶中,自定存入負數的例外

檔案:Account.java
package bank2;

public abstract class Account {
 int balance;
 Account(int money) {
   balance = money;
 }
 public abstract int inquiry();
}


檔案:AccountException.java
package bank2;

public class AccountException extends Exception {
  
 public String getMessage() // 覆寫 Throwable 的 toString()
 {
  return "金額不可以為負數";
 }
 
 public void showMessage() { // 自定方法
  System.out.println("例外發生:請從新輸入金額");
 }
}


檔案:DemandDepositAccount.java
package bank2;

public class DemandDepositAccount extends Account {
 
 DemandDepositAccount(int money){
  super(money);
 }
 
 public void deposit(int money) throws AccountException {
  if (money < 0) {
   throw new AccountException();
  }
  else
   balance += money;
 }
 
 public void withdraw(int money) throws AccountException{
  if (money < 0)
   throw new AccountException();
  else
   balance -= money;
 }

 public int inquiry() {
  return balance;
 }
}


檔案:FixedDepositAccount.java
package bank2;

public class FixedDepositAccount extends Account {

 FixedDepositAccount(int money) {
  super(money);
  // TODO Auto-generated constructor stub
 }

 public FixedDepositAccount() {
  // TODO Auto-generated constructor stub
  super(50000);
 }

 @Override
 public int inquiry() {
  // TODO Auto-generated method stub
  return balance;
 }
}


檔案:AccountTest.java
package bank2;

public class AccountTest {

 public static void main(String[] args) {

    try{
  DemandDepositAccount demandDepositAcc = new DemandDepositAccount(1000);
  demandDepositAcc.deposit(-100);
  demandDepositAcc.withdraw(300);
  System.out.println("活期賬戶餘額:" + demandDepositAcc.inquiry());
   
  FixedDepositAccount fixedDepositAcc = new FixedDepositAccount(20000);
  System.out.println("定期賬戶餘額:" + fixedDepositAcc.inquiry());
   
    }
    catch(AccountException e){
  System.out.println(e.toString());
  e.showMessage();
    } 
 }
}

執行結果

練習2 - 繼承, 抽象類別,抽象方法

續練習 1。沒有久,張三又去福爾摩沙銀行開立定期賬戶 Fixed Deposit。張三存入 30,000 元,約定一年後到期。此帳戶,銀行只提供餘額查詢的功能。 提示: 1. 以抽象類別、方法實作

檔案:Account.java
package bank2;

public abstract class Account {
 int balance;
 Account(int money){
  balance = money;
 }
 public abstract int inquiry();
}



檔案:FixedDepositAccount.java
package bank2;

public class FixedDepositAccount extends Account {

 FixedDepositAccount(int money) {
  super(money);
  // TODO Auto-generated constructor stub
 }

 @Override
 public int inquiry() {
  // TODO Auto-generated method stub
  return balance;
 }
}


檔案:DemandDepositAccount.java
package bank2;

public class DemandDepositAccount extends Account {
 
 DemandDepositAccount(int money){
  super(money);
 }
 
 public void deposit(int money) {
  balance += money;
 }
 
 public void withdraw(int money){
  balance -= money;
 }

 public int inquiry() {
  return balance;
 }
}


檔案:AccountTest.java
package bank2;

import bank.DemandDepositAccount;

public class AccountTest {

 public static void main(String[] args) {
  DemandDepositAccount demandDepositAcc = new DemandDepositAccount(1000);
  demandDepositAcc.deposit(500);
  demandDepositAcc.withdraw(300);
  System.out.println("活期賬戶餘額:" + demandDepositAcc.inquiry());
  
  FixedDepositAccount fixedDepositAcc = new FixedDepositAccount(10000);
  System.out.println("定期存款餘額:" + fixedDepositAcc.inquiry());
 }

}

執行結果











練習 1:單 class 類別

3/18 某天張三因業務需要至福爾摩沙銀行(Formosa Bank) 開立一個活期存款(Demand deposit)戶頭,銀行行員告知,開戶金額最低為 1000 元,可隨時存取,銀行亦提供餘額查詢的服務。張三以最低金額開戶,之後 3/30 存入 500 元,而於 4/8 領取 300 元後,ATM 會顯示餘額剩下多少元?注意:銀行會將此帳戶存在 bank 的目錄夾。 提示: 1. 套件 package 設為 bank 2. 活期賬戶 Demand Deposit Account

檔案:DemandDepositAccount.java
package bank;

public class DemandDepositAccount {
 int balance;
 
 DemandDepositAccount(int deposit){
  balance = deposit;
 }
 
 public void deposit(int money) {
  balance += money;
 }
 
 public void withdraw(int money){
  balance -= money;
 }

 public int inquiry() {
  return balance;
 }
}



檔案:AccountText.java
package bank;

public class AccountTest {

 public static void main(String[] args) {
  DemandDepositAccount demandDepositAcc = new DemandDepositAccount(1000);
  demandDepositAcc.deposit(500);
  demandDepositAcc.withdraw(300);
  System.out.println("活期賬戶餘額:" + demandDepositAcc.inquiry());
 }

}
執行結果