Kapitel 5. Definition af klasser

Kapitlet forudsættes af resten af bogen.

Forudsætter Kapitel 4, Objekter.

Er man i gang med et større program, vil man have brug for at definere sine egne specialiserede klasser. Et regnskabsprogram kunne f.eks. definere en Konto-klasse. Ud fra Konto-klassen ville der blive skabt et antal konto-objekter svarende til de konti, der skulle administreres.

I dette kapitel ser vi på, hvordan man selv definerer sine egne klasser. Vi minder om, at

En klasse er en skabelon, som man kan danne objekter ud fra

Klassen beskriver variabler og metoder, der kendetegner objekterne

Et objekt er en konkret forekomst (instans) af klassen

Når man programmerer objektorienteret, samler man data i selvstændige objekter og definerer metoder, som arbejder på disse data i objekterne.

5.1. En Boks-klasse

Lad os tage et eksempel på en klassedefinition:

Figur 5-1. Java

Vi definerer klassen Boks, som indeholder tre variabler, nemlig bredde, højde og længde. Derudover definerer vi metoden volumen(), som arbejder på disse data. Metoden returnerer en double og tager ingen parametre.

public class Boks
{
  double længde;
  double bredde;
  double højde;

  double volumen()
  {
    double vol;
    vol = længde*bredde*højde;
    return vol; 
  }
}

5.1.1. Variabler

Variablerne bredde, højde og længde kaldes også objektvariabler, fordi hvert Boks-objekt har en af hver.

Objektvariabler erklæres direkte i klassen uden for metoderne

Vi kan lave et Boks-objekt, boksobjekt med new:

    Boks boksobjekt;
    boksobjekt = new Boks();

Nu er der oprettet et Boks-objekt i lageret, der således har en højde-, en bredde- og en længde-variabel.

Variablen vol kaldes en lokal variabel, fordi den er erklæret lokalt i volumen-metoden.

En variabel erklæret inde i en metode kaldes en lokal variabel

Lokale variabler eksisterer kun, så længe metoden, hvori de er erklæret, udføres

Modsat højde, længde og bredde begynder vol-variabler altså ikke at eksistere, bare fordi vi har skabt en Boks.

5.1.2. Brug af klassen

Objekter af klassen Boks kan f.eks. benyttes på følgende måde:

public class BenytBoks
{
  public static void main(String args[])
  {
    double rumfang;

    Boks boksobjekt;
    boksobjekt = new Boks();
    boksobjekt.længde= 12.3;
    boksobjekt.bredde= 2.22;
    boksobjekt.højde = 6.18;
    rumfang = boksobjekt.volumen();
    System.out.println("Boksens volume: "+ rumfang);
  }
}
Boksens volume: 168.75108

Som det ses, er det klassen BenytBoks, der indeholder main()-metoden. Der skal være én og kun én klasse med en main-metode i et program. En sådan "main-klasse" bruges ikke til at definere objekttyper med - kun til at angive, hvor programmet skal startes.

I følgende sætninger (i klassen BenytBoks) sættes det nyoprettede Boks-objekts variabler:

  boksobjekt.længde= 12.3;
  boksobjekt.bredde= 2.22;
  boksobjekt.højde = 6.18;

I den efterfølgende sætning:

  rumfang = boksobjekt.volumen();

kaldes metoden volumen() i Boks-objektet, der udregner rumfanget ud fra variablerne, som er blevet tilført data i linjerne ovenfor. Metoden returnerer en double - denne lægges over i rumfang-variablen, som udskrives.

5.1.3. Metodedefinition

Når vi definerer en metode, giver vi den et hoved og en krop.

Hovedet ligner den måde vi tidligere har set metoder opremset på. Metodehovedet fortæller metodens navn, returtype og hvilke parametre den eventuelt tager:

  double volumen()

Kroppen kommer lige under hovedet:

  {
    double vol;
    vol = længde*bredde*højde;
    return vol; 
  }

I kroppen står der, hvad der skal ske, når metoden kaldes. Her står altså, at når metoden volumen() kaldes, bliver der først oprettet en lokal variabel, vol. Denne bliver tildelt produktet af de tre variabler længde, bredde og højde. Den sidste linje i kroppen fortæller, at resultatet af vol bliver givet tilbage (returneret) til der, hvor metoden blev kaldt.

En metodekrop udføres, når metoden kaldes

Variablerne længde, bredde og højde, som kroppen bruger, er dem, der findes i netop det objekt, som volumen()-metoden blev kaldt på. Lad os kigge på en stump af BenytBoks:

    boksobjekt.længde= 12.3;
    boksobjekt.bredde= 2.22;
    boksobjekt.højde= 6.18;
    rumfang = boksobjekt.volumen();

Her får det Boks-objekt, som boksobjekt refererer til, sat sine variabler, og når metoden volumen() derefter kaldes på dette objekt, vil længde, bredde og højde have disse værdier. rumfang bliver sat til den værdi, vol har i return-linjen, og vol nedlægges (da den er en lokal variabel).

En return-sætning afslutter udførelsen af metodekroppen og leverer en værdi tilbage til kalderen

5.1.4. Flere objekter

Herunder opretter vi to bokse og udregner deres forskel i rumfang. Hver boks er et aftryk af Boks-klassen forstået på den måde, at de hver indeholder deres egne sæt variabler. Variablen bredde kan således have forskellige værdier i hvert objekt.

public class BenytBokse
{
  public static void main(String args[])
  {
    Boks boks1, boks2;
    boks1 = new Boks();
    boks2 = new Boks();

    boks1.længde= 12.3;
    boks1.bredde= 2.22;
    boks1.højde= 6.18;

    boks2.længde= 13.3;
    boks2.bredde= 3.33;
    boks2.højde= 7.18;

    double v1, v2;

    v1 = boks1.volumen();
    v2 = boks2.volumen();

    System.out.println("Volumenforskel: "+ (v2 - v1));
  }
}
Volumenforskel: 149.24394

Når vi kalder volumen() på boks1 og boks2, er det således to forskellige sæt længde-, højde- og bredde-variabler, der bliver brugt til beregningen når volumen()'s krop udføres.