In this example we will see Advance Object Oriented Programming.
We will use a simple banking example for this.
Steps:
- Create folder “src”.      This will contain all java files.
- Then create      AdvOOPTest1 to test the application.
The structure will be as follow
- src/InsufficientFundsException.java
- src/IllegalTransferException.java
- src/Account.java
- src/CustomerAccount.java
- src/CurrentAccount.java
- src/SavingsAccount.java
- src/Banker.java
- AdvOOPTest1.java
IllegalTransferException.java
 
IllegalTransferException.java
package com.pravin.banking;
public class IllegalTransferException extends RuntimeException{}Account.java
package com.pravin.banking;
/**  An abstract super-class for all account types in the bank. @author Pravin @see SavingsAccount @see CurrentAccount */public abstract class Account{  long id;
 /**   Returns ID of this account.  */ public long getId(){  return id; }
 /**   Returns the current-balance in this account.  */ public abstract double getBalance();
 /**   Credits the specified amount in this account.  */ public abstract void deposit(double amount);
 /**   Debits the specified amount from this account.  @throws InsufficientFundsException Specified amount cannot be withdrawn  */ public abstract void withdraw(double amount) throws InsufficientFundsException;
 /**   Transfer specified amount to another account.  @param amount Funds to transfer  @param other The target account  @throws InsufficientFundsException This account does not hold specified             amount  @throws IllegalTransferException Target account is identical to this                                    account  */ public final void transfer(double amount, Account other) throws InsufficientFundsException{  if(other == this)   throw new IllegalTransferException();  this.withdraw(amount);  other.deposit(amount); }}CustomerAccount.java
package com.pravin.banking;
public abstract  class CustomerAccount extends Account{  protected double balance;
 public double getBalance(){  return balance; }
 public void deposit(double amount){  balance += amount; }}CurrentAccount.java
package com.pravin.banking;
public final class CurrentAccount extends CustomerAccount{  public void withdraw(double amount){  balance -= amount; }}SavingsAccount.java
package com.pravin.banking;
public final class SavingsAccount extends CustomerAccount          implements Profitable{  public static final double MIN_BALANCE = 500.0;
 public SavingsAccount(){  balance = MIN_BALANCE; }
 public void withdraw(double amount) throws InsufficientFundsException{  if(balance - amount <>   throw new InsufficientFundsException();  balance -= amount;  }
 public double addInterest(int period){  float rate = (balance <>  double interest = balance * rate * period / 100;  balance += interest;  return interest; }}Banker.java
package com.pravin.banking;
public class Banker{  private static Banker singleton;
 private long nextId;
 private Banker(){  nextId = System.currentTimeMillis() % 1000000; }
 public static Banker getBanker(){  if(singleton == null)   singleton = new Banker();  return singleton;  }
 public Account openAccount(double amount, boolean savings){  Account acc;  if(savings)   acc = new SavingsAccount();  else   acc = new CurrentAccount();  acc.id = nextId++;  acc.deposit(amount);  return acc; }
 public final Account openAccount(double amount){  return openAccount(amount, false); }}AdvOOPTest1.java
import com.pravin.banking.*;
class AdvOOPTest1{  public static void main(String[] args){  Banker b = Banker.getBanker();  Account cust = b.openAccount(4500, true);  Account vend = b.openAccount(0);  try{   double amt = Double.parseDouble(args[0]);   cust.transfer(amt, vend);  }catch(InsufficientFundsException e){   System.out.println("ERROR: Transfer aborted due to lack of funds!");  }catch(Exception e){   System.out.printf("ERROR: %s%n", e);  }    System.out.printf("Customer Account ID is %d and Balance is %.2f%n", cust.getId(), cust.getBalance());  System.out.printf("Vendor Account ID is %d and Balance is %.2f%n", vend.getId(), vend.getBalance()); }}To compile:
javac -d . src/*.java
javac AdvOOPTest1.java
To run:
java AdvOOPTest1 2000
