5.3. Konstruktører

En konstruktør (eng.: constructor) er en speciel metode, der har samme navn som klassen. Den kaldes automatisk ved oprettelse af et objekt med 'new'-operatoren og benyttes oftest til at klare forskellige former for initialisering af det nye objekt.

Som vi så i forrige kapitel (i tilfældet med Rectangle, Point og Date), kan man have flere konstruktører for en klasse, bare parameterlisterne er forskellige.

Her kommer et eksempel med nogle konstruktører:

Figur 5-3. Java


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

  public Boks3()
  {
    System.out.println("Standardboks oprettes");
    sætMål(10, 10, 10);
  }

  // En anden konstruktør der tager bredde, højde og længde
  public Boks3(double lgd, double b, double h)
  {
    System.out.println("Boks oprettes med lgd="+lgd+" b="+b+" h="+h);
    sætMål(lgd,b,h);
  }

  public void sætMål(double lgd, double b, double h)
  {
    if (lgd<=0 || b<=0 || h<=0) 
    {
       System.out.println("Ugyldige mål. Bruger standardmål.");
      længde = 10.0;
      bredde = 10.0;
      højde  = 10.0;
    } else {
      længde = lgd;
      bredde = b;
      højde  = h;
    }
  }

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

Bemærk:

En konstruktør erklæres som en metode med samme navn som klassen

En konstruktør har ingen returtype - ikke engang 'void'

I ovenstående eksempel er der defineret to konstruktører:


  public Boks3()
  public Boks3(double lgd, double b, double h)

Vi prøver Boks3 med:


public class BenytBoks3
{
  public static void main(String args[])
  {
    Boks3 enBoks;
    // brug konstruktøren uden parametre
    enBoks = new Boks3();

    System.out.println("Volumen er: "+ enBoks.volumen());

    Boks3 enAndenBoks;
    // brug den anden konstruktør
    enAndenBoks = new Boks3(5,5,10);

    System.out.println("Volumen er: "+ enAndenBoks.volumen());
  }
}

Standardboks oprettes
Volumen er: 1000.0
Boks oprettes med lgd=5.0 b=5.0 h=10.0
Volumen er: 250.0

5.3.1. Standardkonstruktører

Når vi i de foregående eksempler (f.eks. Boks2) ikke har benyttet en konstruktør, er det, fordi Java, hvis ikke en konstruktør er erklæret, selv erklærer en tom standardkonstruktør uden parametre. Dvs. Java i Boks2's tilfælde usynligt har defineret konstruktøren:


public Boks2()
{
}

Denne konstruktør har vi kaldt, hver gang vi har oprettet et objekt med 'new'.

Der kaldes altid en konstruktør, når et objekt oprettes

Standardkonstruktøren genereres automatisk, hvis der ikke er andre konstruktører i klassen

En standardkonstruktør genereres kun, hvis der ikke er andre konstruktører i klassen.

Hvis vi ikke havde defineret en konstruktør uden parametre i Boks3, ville oversætteren i BenytBoks3 brokke sig over, at denne type konstruktør ikke fandtes:


  BenytBoks3.java:7: No constructor matching Boks3() found in class Boks3.
                  enBoks = new Boks3();

5.3.2. Opgaver

  1. Definér klassen Pyramide. Objekterne skal have variablerne side og højde (definér en konstruktør) og en metode til at udregne volumen (side*side*højde/4). Skriv en BenytPyramider, som opretter 3 pyramider og udregner volumen.

  2. Ret Boks3 til også at have variablen massefylde, og definér en ekstra konstruktør der også tager massefylden (den oprindelige konstruktør med lgd, b og h kan sætte massefylden til 1). Lav også metoder til at sætte massefylden, sætMassefylde(double m), og udregne vægten, vægt(). Test din klasse med en ændret udgave af BenytBoks3.