Objectgeoriënteerd Programmeren in Java

Java OOP-concepten leren door praktische voorbeelden en oefenprojecten. Ga met mij mee terwijl ik de fundamenten van objectgeoriënteerd programmeren verken!

4 Kernprincipes
6 Maanden Leren
5+ Oefenprojecten
Animal.java
// Mijn eerste Animal klasse!
public class Animal {
    private String naam;
    private int leeftijd;
    
    public Animal(String naam, int leeftijd) {
        this.naam = naam;
        this.leeftijd = leeftijd;
    }
    
    public void maakGeluid() {
        System.out.println("Een algemeen dierengeluid");
    }
    
    public String getNaam() {
        return naam;
    }
}

OOP Fundamenten Leren

Encapsulatie

Leren om data te beschermen met private velden en publieke methoden. Begrijpen waarom we implementatiedetails verbergen.

Overerving

Ouder- en kindklassen maken om gemeenschappelijke functionaliteit te delen. Oefenen met het extends sleutelwoord en methode-overschrijving.

Polymorfisme

Begrijpen hoe dezelfde methode zich anders kan gedragen afhankelijk van het objecttype. Interfaces en methode-overschrijving verkennen.

Abstractie

Leren over abstracte klassen en interfaces. Begrijpen hoe je definieert wat klassen moeten doen zonder te specificeren hoe.

Laten we samen OOP oefenen!

BankRekening.java
public class BankRekening {
    private double saldo;
    private String rekeningNummer;
    
    public BankRekening(String rekeningNummer, double beginSaldo) {
        this.rekeningNummer = rekeningNummer;
        setSaldo(beginSaldo);
    }
    
    public void stort(double bedrag) {
        if (bedrag > 0) {
            saldo += bedrag;
            System.out.println("Gestort: €" + bedrag);
        }
    }
    
    public boolean neemOp(double bedrag) {
        if (bedrag > 0 && bedrag <= saldo) {
            saldo -= bedrag;
            System.out.println("Opgenomen: €" + bedrag);
            return true;
        }
        return false;
    }
    
    public double getSaldo() {
        return saldo;
    }
    
    private void setSaldo(double saldo) {
        this.saldo = Math.max(0, saldo);
    }
}

Probeer het uit

Voertuig Hiërarchie
// Basisklasse
public abstract class Voertuig {
    protected String merk;
    protected int jaar;
    
    public Voertuig(String merk, int jaar) {
        this.merk = merk;
        this.jaar = jaar;
    }
    
    public abstract void start();
    public abstract double getBrandstofVerbruik();
    
    public void toonInfo() {
        System.out.println(jaar + " " + merk);
    }
}

// Afgeleide klasse
public class Auto extends Voertuig {
    private int deuren;
    
    public Auto(String merk, int jaar, int deuren) {
        super(merk, jaar);
        this.deuren = deuren;
    }
    
    @Override
    public void start() {
        System.out.println("Auto motor gestart met sleutel");
    }
    
    @Override
    public double getBrandstofVerbruik() {
        return 8.5; // L/100km
    }
}

// Nog een afgeleide klasse
public class Motorfiets extends Voertuig {
    private boolean heeftZijspan;
    
    public Motorfiets(String merk, int jaar, boolean heeftZijspan) {
        super(merk, jaar);
        this.heeftZijspan = heeftZijspan;
    }
    
    @Override
    public void start() {
        System.out.println("Motorfiets gestart met knop");
    }
    
    @Override
    public double getBrandstofVerbruik() {
        return 4.2; // L/100km
    }
}

Voertuig Overerving Demo

Selecteer een voertuigtype om overerving in actie te zien!

Vorm Polymorfisme
public interface Tekenbaar {
    void teken();
    double berekenOppervlakte();
}

public class Cirkel implements Tekenbaar {
    private double straal;
    
    public Cirkel(double straal) {
        this.straal = straal;
    }
    
    @Override
    public void teken() {
        System.out.println("Een cirkel tekenen");
    }
    
    @Override
    public double berekenOppervlakte() {
        return Math.PI * straal * straal;
    }
}

public class Rechthoek implements Tekenbaar {
    private double breedte, hoogte;
    
    public Rechthoek(double breedte, double hoogte) {
        this.breedte = breedte;
        this.hoogte = hoogte;
    }
    
    @Override
    public void teken() {
        System.out.println("Een rechthoek tekenen");
    }
    
    @Override
    public double berekenOppervlakte() {
        return breedte * hoogte;
    }
}

// Polymorf gebruik
public class VormBeheerder {
    public void verwerkVormen(Tekenbaar[] vormen) {
        for (Tekenbaar vorm : vormen) {
            vorm.teken(); // Polymorfe aanroep
            System.out.println("Oppervlakte: " + vorm.berekenOppervlakte());
        }
    }
}

Polymorfisme Visualisatie

Database Abstractie
// Abstracte klasse die het contract definieert
public abstract class DatabaseVerbinding {
    protected String verbindingsString;
    
    public DatabaseVerbinding(String verbindingsString) {
        this.verbindingsString = verbindingsString;
    }
    
    // Abstracte methoden - moeten geïmplementeerd worden door subklassen
    public abstract void verbind();
    public abstract void verbreekVerbinding();
    public abstract boolean voerQueryUit(String query);
    
    // Concrete methode - gemeenschappelijk voor alle implementaties
    public void logOperatie(String operatie) {
        System.out.println("[" + this.getClass().getSimpleName() + "] " + operatie);
    }
}

// Concrete implementatie voor MySQL
public class MySQLVerbinding extends DatabaseVerbinding {
    public MySQLVerbinding(String verbindingsString) {
        super(verbindingsString);
    }
    
    @Override
    public void verbind() {
        logOperatie("Verbinding maken met MySQL database...");
        // MySQL-specifieke verbindingslogica
    }
    
    @Override
    public void verbreekVerbinding() {
        logOperatie("Verbinding verbreken met MySQL database...");
        // MySQL-specifieke verbreek logica
    }
    
    @Override
    public boolean voerQueryUit(String query) {
        logOperatie("MySQL query uitvoeren: " + query);
        return true; // Gesimuleerd succes
    }
}

// Concrete implementatie voor PostgreSQL
public class PostgreSQLVerbinding extends DatabaseVerbinding {
    public PostgreSQLVerbinding(String verbindingsString) {
        super(verbindingsString);
    }
    
    @Override
    public void verbind() {
        logOperatie("Verbinding maken met PostgreSQL database...");
        // PostgreSQL-specifieke verbindingslogica
    }
    
    @Override
    public void verbreekVerbinding() {
        logOperatie("Verbinding verbreken met PostgreSQL database...");
        // PostgreSQL-specifieke verbreek logica
    }
    
    @Override
    public boolean voerQueryUit(String query) {
        logOperatie("PostgreSQL query uitvoeren: " + query);
        return true; // Gesimuleerd succes
    }
}

Database Abstractie Demo

Java OOP Code Speeltuin

Main.java

Uitvoer

Klik op "Code Uitvoeren" om de Java code uit te voeren en de uitvoer hier te zien!

// Dit zal tonen:
// - Dierengeluiden (polymorfisme)
// - Bankrekening operaties (encapsulatie)
// - Leernotities over OOP concepten

// TIP: Probeer diernamen, leeftijden of rekeningsaldi te veranderen!
// De code parser is flexibel en past zich aan jouw wijzigingen aan.

Klaar wanneer jij het bent! 🚀

Mijn Leerprojecten

Eenvoudig Tekstgebaseerd Spel 🎮

Mijn eerste spel met basis OOP! Verschillende karakterklassen gemaakt die overerven van een Speler klasse. Leren over constructors en methode-overschrijving.

Klassen Overerving Methoden
✅ Werkende demo hieronder beschikbaar!

Student Cijfer Calculator 📊

Een console-app om studentencijfers te berekenen. Encapsulatie gebruikt om studentdata te beschermen en methoden gemaakt voor cijferberekeningen. Nog steeds leren over getters/setters!

Encapsulatie Methoden Data Validatie
✅ Werkende demo hieronder beschikbaar!

Huisdier Beheersysteem 🐶

Leerproject met Hond en Kat klassen die overerven van Dier. Methode-overschrijving geoefend voor verschillende dierengeluiden. Mijn eerste poging tot polymorfisme!

Overerving Polymorfisme Methode Overschrijving
✅ Werkende demo hieronder beschikbaar!

Basis Bibliotheeksysteem 📚

Console-applicatie om boeken en gebruikers te beheren. Leren over klasserelaties en basis CRUD-operaties. Nog steeds bezig met het begrijpen van interfaces!

Klassen ArrayLists Basis CRUD
✅ Werkende demo hieronder beschikbaar!

Probeer Mijn Leerprojecten!

Dit zijn werkende implementaties van de projecten die ik heb gebouwd tijdens het leren van Java OOP. Klik op elk project om ze uit te proberen!

Eenvoudig Tekstgebaseerd Spel

Een basis RPG met verschillende karakterklassen

Kies Je Karakter:

Welkom bij mijn eerste OOP spel! Selecteer een karakter om te beginnen.

Student Cijfer Calculator

Oefenen met encapsulatie en datavalidatie

Voeg Studentencijfers Toe:

Studentenrecords:

Nog geen studenten toegevoegd. Voeg een student toe om encapsulatie in actie te zien!

Huisdier Beheersysteem

Overerving en polymorfisme met dieren

Voeg een Huisdier Toe:

Mijn Huisdieren:

Nog geen huisdieren! Voeg wat huisdieren toe om overerving en polymorfisme werkend te zien.

Basis Bibliotheeksysteem

Klasserelaties en basis CRUD-operaties

Boeken Beheren:

Bibliotheekcatalogus:

Bibliotheek is leeg. Voeg wat boeken toe om te beginnen!