BankAccount-InstanceStatic – instance vs static member field & method
BankAccount
public class BankAccount {
protected String name; // instance field
protected double balance; // instance field
protected static double interestRate; // static field
public BankAccount() { // default constructor
this(1000, "JAVA17");
}
public BankAccount(String name, double balance) {
this.name = name;
this.balance = balance;
BankAccount.interestRate = 1.0;
}
public void deposit(double amount) { // instance method
balance += amount;
}
public void withdraw(double amount) { // instance method
balance -= amount;
}
public void transfer(double amount, BankAccount other) { // instance method
withdraw(amount);
other.deposit(amount);
}
public double getBalance() { // instance method
return balance + balance * interestRate * 0.01;
}
public void print() { // instance method
System.out.println(name + " balance=" + getBalance());
}
@Override // Object.toString() method override
public String toString() { // instance method
return name + " balance=" + getBalance();
}
public static void setInterestRate(double interestRate) { // static method
BankAccount.interestRate = interestRate;
}
}
public class CheckingAccount extends BankAccount {
private double overdraftLimit;
public CheckingAccount(String name, double balance, double overdraftLimit) {
super(name, balance);
interestRate = 2.0;
setOverdraftLimit(overdraftLimit);
}
public void setOverdraftLimit(double overdraftLimit) {
this.overdraftLimit = overdraftLimit;
}
public double getOverdraftLimit() {
return overdraftLimit;
}
@Override // BankAccount.withdraw(double amount) method override
public void withdraw(double amount) {
if(getBalance() - overdraftLimit < amount)
System.out.println("CheckingAccount::withdraw Cannot be withdrawn due to overdraftLimit");
else
super.withdraw(amount);
}
@Override // BankAccount.print() method override
public void print() {
System.out.println("CheckingAccount: " + name + " balance=" + getBalance());
}
}
public class SavingAccount extends BankAccount {
public SavingAccount(String name, double balance) {
super(name, balance);
interestRate = 5.0;
}
@Override // BankAccount.withdraw(double amount) method override
public void withdraw(double amount) {
if (getBalance() < amount)
System.out.println("SavingAccount::withdraw Amount is larger than current balance.");
else
super.withdraw(amount);
}
@Override // BankAccount.print() method override
public void print() {
System.out.println("SavingAccount: " + name + " balance=" + getBalance());
}
}
public class BankAccountTest {
public static void main(String[] args) {
BankAccount b1 = new BankAccount("P", 0);
b1.deposit(3000);
b1.withdraw(1000);
b1.print(); // P balance=2020.0
BankAccount b2 = new BankAccount("K", 0);
b1.print(); // K balance=0.0
System.out.println("transfer 1000 money from b1 to b2");
b1.transfer(1000, b2);
System.out.println("b1: " + b1); // b1: P balance=1010.0
System.out.println("b2: " + b2); // b2: K balance=1010.0
BankAccount c1 = new CheckingAccount("Checking1", 1000, 500);
BankAccount c2 = new CheckingAccount("Checking2", 1000, 500);
c1.withdraw(700); // CheckingAccount::withdraw Cannot be withdrawn due to overdraftLimit
c2.withdraw(800); // CheckingAccount::withdraw Cannot be withdrawn due to overdraftLimit
c1.print(); // CheckingAccount: Checking1 balance=1020.0
c2.print(); // CheckingAccount: Checking1 balance=1020.0
BankAccount s1 = new SavingAccount("Saving1", 1000);
s1.deposit(5000);
s1.withdraw(1000);
s1.print(); // SavingAccount: Saving1 balance=5250.0
BankAccount s2 = new SavingAccount("Saving2", 1000);
s2.withdraw(2000); // SavingAccount::withdraw Amount is larger than current balance.
s2.print(); // SavingAccount: Saving2 balance=1050.0
}
}