^ Linux - Friheden til at programmere i Java: Version 0.7.20040516 - 2020-12-31 ^| | [[java:java-klasser-indkap|forrige]] | Kapitel 5. Definition af klasser | [[java:java-klasser-dice|næste]] | ---- ==== 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** {linuxbog:java:Nordfalk615385.png} 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 === - 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. - 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. ---- | [[java:java-klasser-indkap|forrige]] | [[java:index|hjem]] | [[java:java-klasser-dice|næste]] | | Indkapsling | [[java:java-klasser|op]] | En Terning-klasse |