Saturday, April 1, 2006

Java tutorial - Basics

Intro|Basics|Elementen|Bouwstenen|Datatypen|Operatoren|Toegangscontrole|Draaiboek|Foutenafhandeling|Objecten|Uitvoeren

Object Oriented Programming basics

Abstracties (abstractions)

Om in Java of ieder ander willekeurig object georiënteerde programeertaal te kunnen programmeren, moet je een vermogen hebben om abstract (conceptueel) te kunnen denken. Je moet kunnen kijken naar de essentiële eigenschappen en gedragingen van diverse objecten (voorwerpen). Je moet kunnen kijken naar de overeenkomsten en deze per object te kunnen vastleggen.

Bijvoorbeeld: Alle auto's hebben de volgende overeenkomsten: ze hebben een motor, ze verbruiken brandstof, ze kunnen rijden, ze zijn voorzien van verlichting, ze hebben een aantal zitplaatsen, etc. Alle auto's kunnen tot eenzelfde concept (de klasse) gerekend worden.

Terug naar boven

Klassen (classes)

Een klasse modelleert een abstractie (een concept) door de eigenschappen en de gedragingen te vastleggen.

Bijvoorbeeld: Alle auto's hebben de volgende eigenschappen: een cylinderinhoud, een gewicht, een toerental, een brandstofsoort, een versnelling, een snelheid, een verbruik, een aantal zitplaatsen, etc. Alle auto's hebben de volgende gedragingen: instappen/uitstappen, starten/stoppen, gasgeven/schakelen/remmen, etc.

Terug naar boven

Objecten (objects)

Een object moet alle in de klasse vastgelegde eigenschappen en gedragingen kunnen vertonen. De eigenschappen zijn hetzelfde bij alle objecten van eenzelfde klasse, maar de waarden kunnen per object danwel situatie verschillen. De gedragingen zijn afhankelijk van de eigenschappen en de resultaten van deze gedragingen kunnen per object verschillen.

Bijvoorbeeld: Alle auto's (alle objecten van dezelfde klasse) hebben de volgende eigenschappen die per auto (een object) kunnen verschillen: de cylinderinhoud, het gewicht, het minimum en maximum toerental, het maximum aantal zitplaatsen, de brandstofsoort, etc. Een auto heeft de volgende eigenschappen die per situatie kunnen verschillen: het toerental, de versnelling, het aantal bezette zitplaatsen, de snelheid, het verbruik, etc.

Terug naar boven

Variabelen (variables)

Een variabele legt een eigenschap vast met een waarde dat per object danwel situatie kan verschillen.

Bijvoorbeeld: Een bepaalde auto (een object) heeft een cylinderinhoud van 1910cc, een gewicht van 1330kg, een minimum toerental van 850rpm, een maximum toerental van 4500rpm, een maximum aantal versnellingen van 5, een maximum aantal zitplaatsen van 5, diesel als brandstofsoort, etc. Alle auto's (alle objecten van dezelfde klasse) hebben naar gelang de situatie een wisselend toerental, een wisselende versnelling, een wisselend aantal bezette zitplaatsen, een wisselend snelheid, een wisselend verbruik, etc.

Let op: Een variabele kan óók een object bevatten. Dan heb je dus een hele auto (een object) in één variabele. We spreken hier dan over een instantie. Dit wordt later in deze tutorial beschreven.

Terug naar boven

Methoden (methods)

Een methode beschrijft hoe de gedragingen uitgevoerd moeten worden op basis van de opgegeven informatie (de invoer). De methoden passen de eigenschappen (de variabelen) aan naar gelang de invoer en de huidige situatie. Dit levert een nieuwe situatie op.

Bijvoorbeeld: Het gasgeven (een methode) laat het toerental (een eigenschap) in waarde toenemen. Het instappen laat het aantal beschikbare zitplaatsen in waarde afnemen. De snelheid is afhankelijk van het toerental, de ingestelde versnelling en het gewicht. Het verbruik is afhankelijk van de gemiddelde snelheid, het gemiddeld toerental, de cylinderinhoud en de brandstofsoort.

Terug naar boven

Voorbeeld code

De Java code van het concept "Auto" zoals beschreven in de bovenstaande voorbeelden zou er als volgt kunnen eruitzien:

package nl.balusc.voertuigen;

// De klasse "Auto".
public class Auto {

    // De eigenschappen die voor de hele klasse gelden.
    public static int aantalAutos;

    // De eigenschappen die per auto kunnen verschillen.
    public String autoMerkType = "";
    public int cylinderinhoud;
    public int gewicht;
    public int minimumToerental;
    public int maximumToerental;
    public int maximumVersnelling;
    public int maximumZitplaatsen;
    public String brandstofSoort;

    // De eigenschappen die voor elke auto per situatie kunnen verschillen.
    private int toerental;
    private int versnelling;
    private int zitplaatsenBezet;
    private double snelheid;
    private double verbruik;
    private boolean verlichtingAan;

    // De zogenaamde constructeur. Dit is een speciale methode dat hetzelfde naam
    // als de klasse heeft. Dit wordt bij elke auto aangeroepen en in dit geval
    // wordt er een auto aangemaakt en de hoeveelheid auto's met 1 toegenomen.
    public Auto() {
        maakAuto();
        aantalAutos++;
    }

    // Je kunt meerdere constructeurs in een klasse hebben, elk met een specifieke
    // invoer. In deze constructeur kun je dus een specifiek merk en type opgeven.
    public Auto(String merkType) {
        autoMerkType = merkType;
        maakAuto();
        aantalAutos++;
    }

    // De eigenschappen worden ingesteld, afhankelijk van het merk en de type.
    public void maakAuto() {
        if (autoMerkType.equals("Alfa Romeo 156 1.9 JTD SW")) {
            cylinderinhoud = 1910;
            gewicht = 1330;
            minimumToerental = 850;
            maximumToerental = 4500;
            maximumVersnelling = 5;
            maximumZitplaatsen = 5;
            brandstofSoort = "Diesel";
        } else if (autoMerkType.equals("BMW M6")) {
            cylinderinhoud = 4999;
            gewicht = 1710;
            minimumToerental = 750;
            maximumToerental = 7750;
            maximumVersnelling = 6;
            maximumZitplaatsen = 4;
            brandstofSoort = "Benzine";
        } else { // Onbekende auto, dus we maken een "standaard" auto.
            cylinderinhoud = 2000;
            gewicht = 1250;
            minimumToerental = 1000;
            maximumToerental = 6000;
            maximumVersnelling = 5;
            maximumZitplaatsen = 5;
            brandstofSoort = "Benzine";
        }
    }

    // De methode "instappen".
    public void instappen(int aantalMensen) {
        zitplaatsenBezet = zitplaatsenBezet + aantalMensen;
        
        if (zitplaatsenBezet > maximumZitplaatsen) {
            int teveelMensen = zitplaatsenBezet - maximumZitplaatsen;
            System.out.println("Er zijn " + maximumZitplaatsen + " zitplaatsen.");
            System.out.println("Er moeten " + teveelMensen + " mensen eruit.");
        }
    }

    // De methode "uitstappen".
    public void uitstappen(int aantalMensen) {
        zitplaatsenBezet = zitplaatsenBezet - aantalMensen;
    }

    // De methode "starten".
    public void starten() {
        toerental = minimumToerental;
        verlichtingAan = true;
    }

    // De methode "stoppen".
    public void stoppen() {
        toerental = 0;
        verlichtingAan = false;
    }

    // De methode "gasgeven".
    public void gasgeven(int aantalToeren) {
        toerental = toerental + aantalToeren;
        
        if (toerental > maximumToerental) {
            toerental = maximumToerental;
            System.out.println("Niet teveel gasgeven he!");
            System.out.println("De toerentalbegrenzer is in werking getreden.");
        }
    }

    // De methode "schakelen".
    public void schakelen(int aantalZetten) {
        versnelling = versnelling + aantalZetten;
        
        if (versnelling > maximumVersnelling) {
            versnelling = maximumVersnelling;
            System.out.println("Er is geen hogere versnelling beschikbaar.");
        }
        // Hier moet ook berekend kunnen worden dat het toerental met een bepaald
        // aantal toeren bijgesteld moet worden.
    }

    // De methode "remmen".
    public void remmen(int remkracht) {
        // Bereken hier het nieuwe toerental en de nieuwe vernsnelling aan de hand
        // van de remkracht.
    }

    // De methode om het huidige verbruik te bereken en verkrijgen.
    public double berekenVerbruik() {
        // Bereken hier het verbruik aan de hand van het gemiddelde snelheid, het
        // gemiddeld toerental, de cylinderinhoud en de brandstofsoort.
        return verbruik;
    }

    // De methode om de huidige snelheid te bereken en verkrijgen.
    public double berekenSnelheid() {
        // Bereken hier de snelheid aan de hand van het toerental, de ingestelde
        // versnelling en het gewicht.
        return snelheid;
    }

    // De methode om het huidige aantal vrije zitplaatsen te bereken en verkrijgen.
    public int berekenAantalZitplaatsenVrij() {
        int aantalZitplaatsenVrij = maximumZitplaatsen - zitplaatsenBezet;
        return aantalZitplaatsenVrij;
    }

}
Terug naar boven

Dat was een flinke lap ..

En dat was in theorie ook nog verre van compleet. Code-technisch gezien kan dit ook wel netter (de invoer controleren, de eventuele excepties afvangen, de eigenschappen van verschillende auto's opsommen, etc), maar dan wordt het voor de beginner veel te ingewikkeld. Op het moment zou slechts het lezen van de commentaren, de benamingen van de eigenschappen (de variabelen) en die van de gedragingen (de methoden) met behulp van enig wiskundig/logisch inzicht afdoende zijn om de insteek van deze code te begrijpen. De afzonderlijke onderdelen en verfijningen worden gedurende deze tutorial wel tot in detail toegelicht.

Terug naar boven


In het volgende hoofdstuk wordt globaal uitgelegd hoe je met de klassen, objecten, variabelen en methoden kunt werken: Elementen.

Copyright - Niets van deze pagina mag worden overgenomen zonder uitdrukkelijke toestemming.

(C) April 2006, BalusC

1 comment:

Dean said...

Dit is eens goed uitgelegd! Ik zocht naar een tutorial waar er goede voorbeelden werden gegeven waar je onmiddelijk de toepassing van snapt, dat is met de jouwe het geval.

Bedankt!