Programmeren in Java/Overerving
Nu dat je klassen hebt gezien en misschien ondertussen meerdere klassen hebt gemaakt, zal je misschien al hebben gemerkt dat je klassen hebt die verwant zijn aan elkaar. Je hebt misschien een klasse geschreven voor een Car (auto), Bus, Bicycle (fiets), enzoverder.. Allemaal zijn ze voertuigen, machines die we gebruiken om ons te verplaatsen. Ze hebben misschien bepaalde eigenschappen of functionaliteit gemeen. Sommige hebben een motor, andere niet, sommige hebben passagiers, andere weer niet, sommige hebben bovendien véél passagiers en andere minder, enzoverder...
Je kunt deze eigenschappen en functionaliteiten per klasse apart definiëren, maar dat is weer véél dubbel werk en kan ook weer leiden tot meer fouten. Wat je kunt doen is voor deze klassen een overkoepelende klasse maken die alle eigenschappen en functionaliteiten kan bevatten en waar de onderliggende klassen gebruik van kan maken.
Simpel voorbeeld
bewerkenUitgebreid voorbeeld
bewerkenIn onderstaand voorbeeld is de klasse BankAccount(bankrekening) de verzameling van alle gemeenschappelijke velden en methoden. De klassen SavingsAccount (spaarrekening) en CurrentAccount (zichtrekening) bevatten de gespecialiseerde gegevens. Men spreekt in dit verband ook over generalisatie en specialisatie. De klasse BankAccount is de basisklasse (of de superklasse of de parentklasse) van de SavingsAccount en de CurrentAccount. De SavingsAccount en de CurrentAccount zijn de subklassen (of de childclasses of de derived- of afgeleide klassen) van de BankAccount.
public class BankAccount {
private final String accountNumber;
public double amount;
public BankAccount(String accountNumber){
this.accountNumber = accountNumber;
amount = 0;
}
public void deposit(double amount) {
this.amount += amount;
}
public void withdraw(double amount) {
this.amount -= amount;
}
public void transfer(BankAccount bankAccount, double amount) {
this.amount -= amount;
bankAccount.deposit(amount);
}
public double getAmount() {
return amount;
}
}
public class CurrentAccount extends BankAccount {
private final int maxCredit;
public CurrentAccount(String accountNumber, int maxCredit) {
super(accountNumber);
maxCredit = maxCredit;
}
}
public class SavingsAccount extends BankAccount {
private static double interest;
public SavingsAccount(String accountNumber, double interest) { //constructor
super(accountNumber);
this.interest = interest;
}
public SavingsAccount(String accountNumber, double interest, double amount) {
this(accountNumber, interest);
this.amount = amount;
}
public void deposit(double amount) {
this.amount += amount;
}
public void withdraw(double amount) {
this.amount -= amount;
}
public void overschrijven(SavingsAccount spaarRek, double amount) {
this.amount -= amount;
spaarRek.deposit(amount);
}
public double getAmount() {
return amount;
}
public static double getInterest() {
return interest;
}
}
public class Main {
public static void main(String[] args) {
SavingsAccount savingsAccount = new SavingsAccount("1234", 2.5);
CurrentAccount currentAccount = new CurrentAccount("9876", 1000);
savingsAccount.deposit(100.0);
currentAccount.deposit(200.0);
currentAccount.withdraw(50.0);
System.out.println("Saldo van spaarrekening: " + savingsAccount.getAmount());
System.out.println("Saldo van zichtrekening: " + currentAccount.getAmount());
}
}
(Merk op dat double een binaire komma heeft en dus niet geschikt is voor exacte berekeningen met decimale fracties. In het echt zou hier een integertype voor gebruikt worden.)