Naar inhoud springen

Programmeren in Java/Overerving

Uit Wikibooks

Programmeren in JavaIn ontwikkeling. Revisiedatum: onbekend

InleidingRedelijk ontwikkeld. Revisiedatum: 22 augustus 2008

InstallatieIn ontwikkeling. Revisiedatum: 26 decemeber 2020

HulpmiddelenNog vrijwel niets. Revisiedatum: 26 decemeber 2020
  1. IntroductieGoed ontwikkeld. Revisiedatum: 19 januari 2021
  2. KlassenRedelijk ontwikkeld. Revisiedatum: 22 januari 2021
  3. PackageGoed ontwikkeld. Revisiedatum: 28 januari 2021
  4. Private en PublicGoed ontwikkeld. Revisiedatum: 27 december 2020
  5. Getters en SettersGoed ontwikkeld. Revisiedatum: 19 januari 2021
  6. StaticGoed ontwikkeld. Revisiedatum: 16 maart 2021
  7. OverervingIn ontwikkeling. Revisiedatum: 20 januari 2007
  8. ProtectedNog vrijwel niets. Revisiedatum: 22 januari 2021
  9. AbstractNog vrijwel niets. Revisiedatum: 22 januari 2021
  10. InterfacesNog vrijwel niets. Revisiedatum: 19 januari 2021
  11. EnumsGoed ontwikkeld. Revisiedatum: 15 augustus 2020
  12. GenericsNog vrijwel niets. Revisiedatum: 19 januari 2021
  13. Boxing en UnboxingGoed ontwikkeld. Revisiedatum: 22 januari 2021
  14. OptionalNog vrijwel niets. Revisiedatum: 21 december 2020
  15. Functionele interfacesNog vrijwel niets. Revisiedatum: 19 januari 2021
Appendices

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

[bewerken]

Uitgebreid voorbeeld

[bewerken]

In 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.)

Informatie afkomstig van Wikibooks NL, een onderdeel van de Wikimedia Foundation.