Permalänk

Java konstruktorer vid arv

Hej
Först jag vill att säga ursäkta med språket.
Jag läser programmering 2 nu själv och jag förstår inte riktigt "Konstruktorer vid arv"

Jag har en exempel från lärobok

public class Bostadshus extends Hus{ boolean tilläggsisolerat; Bostadshus(boolean isol){ tiläggsisolerat = isol; } Bostadshus(){ tilläggsisolerat= true; } Bostadshus(double l, double b, int v, boolean isol){ super(l,b,v); tilläggsisolerat=isol; } Bostadshus(double l, double b, int v){ this(l, b, v, true); } övriga metoder }

För mig, den exempel är svårt att förstå. Varför skriver tilläggsisolerat=isol; två gånger? Varför måste vi göra metod

Bostadshus(double l, double b, int v){ this(l, b, v, true); }

när vi redan har

Bostadshus(double l, double b, int v, boolean isol){ super(l,b,v); tilläggsisolerat=isol; }

?? Vad är skillnad mellan dem?? Finns förklaring i min lärobok men jag förstår inte exakt..

Permalänk

Det är två olika konstruktorer. Du kan instansiera klassen på flera sätt:

new Bostadshus(1.0,1.0,1)

eller

new Bostadshus(1.0,1.0,1,true)

Väljer du den senare metoden har du möjlighet att specificera om det ska vara tilläggsisolerat eller inte, använder du den första konstruktorn kommer den alltid sättas till true.

Edit:
Fördelen är alltså att det blir färre argument som behöver skickas med i de fall där du vet att det ska vara tilläggsisolerat. I många andra språk kan man sätta defaultvärden på parametrar, men i java måste man overloada på det här sättet.

Permalänk
Avstängd

@ProgrammeringElev: I den ena skickar du med en bool som anger ifall huset är isolerat eller ej, i den andra gör man inte det utan förutsätter att det är det (isolerat alltså). Den andra anropar ju den första och skickar med de parametrar den har fått samt då true för isoleringen. Det handlar om att förenkla anropet, du skulle lika gärna kunna använda den första för allt men om merparten av husen som skapas är isolerade så kan det vara skönt att kunna skippa att skicka true på de som är det.

Permalänk
Medlem

Om vi först tittar på konstruktorn nedan:

Bostadshus(double l, double b, int v) { this(l, b, v, true); }

Denna skickar vidare l, b, v samt isol=true till ytterligare en av Bostadshus konstruktorer, nämligen

Bostadshus(double l, double b, int v, boolean isol) { super(l,b,v); tilläggsisolerat=isol; }

Här sätts l, b, v till Hus via Huskonstruktorn och isol sätts till Bostadshus via vanlig tilldelning.

Däremot, om du kallar nedanstående direkt så måste du själv sätta parametern isol till true för att få samma effekt, så visst finns det skillnad även om den är liten.

Bostadshus(double l, double b, int v, boolean isol) { super(l,b,v); tilläggsisolerat=isol; }

Edit: too late

Permalänk
Skrivet av Full Strike:

Det är två olika konstruktorer. Du kan instansiera klassen på flera sätt:

new Bostadshus(1.0,1.0,1)

eller

new Bostadshus(1.0,1.0,1,true)

Väljer du den senare metoden har du möjlighet att specificera om det ska vara tilläggsisolerat eller inte, använder du den första konstruktorn kommer den alltid sättas till true.

Edit:
Fördelen är alltså att det blir färre argument som behöver skickas med i de fall där du vet att det ska vara tilläggsisolerat. I många andra språk kan man sätta defaultvärden på parametrar, men i java måste man overloada på det här sättet.

Skrivet av snajk:

@ProgrammeringElev: I den ena skickar du med en bool som anger ifall huset är isolerat eller ej, i den andra gör man inte det utan förutsätter att det är det (isolerat alltså). Den andra anropar ju den första och skickar med de parametrar den har fått samt då true för isoleringen. Det handlar om att förenkla anropet, du skulle lika gärna kunna använda den första för allt men om merparten av husen som skapas är isolerade så kan det vara skönt att kunna skippa att skicka true på de som är det.

Skrivet av Dalton Sleeper:

Om vi först tittar på konstruktorn nedan:

Bostadshus(double l, double b, int v) { this(l, b, v, true); }

Denna skickar vidare l, b, v samt isol=true till ytterligare en av Bostadshus konstruktorer, nämligen

Bostadshus(double l, double b, int v, boolean isol) { super(l,b,v); tilläggsisolerat=isol; }

Här sätts l, b, v till Hus via Huskonstruktorn och isol sätts till Bostadshus via vanlig tilldelning.

Däremot, om du kallar nedanstående direkt så måste du själv sätta parametern isol till true för att få samma effekt, så visst finns det skillnad även om den är liten.

Bostadshus(double l, double b, int v, boolean isol) { super(l,b,v); tilläggsisolerat=isol; }

Edit: too late

Tack alla för snälla svar!
Men jag har en fråga till

Bostadshus(double l, double b, int v){ this(l, b, v, true) }

Varför kan vi skriva boolean true här när parametern har bara tre argument double och int ? Kan this ha hur mycket argument som helst??

Permalänk
Medlem
Skrivet av ProgrammeringElev:

Tack alla för snälla svar!
Men jag har en fråga till

Bostadshus(double l, double b, int v){ this(l, b, v, true) }

Varför kan vi skriva boolean true här när parametern har bara tre argument double och int ? Kan this ha hur mycket argument som helst??

Den kan inte ha hur många parametrar som helst helt utan vidare, det måste matcha några av de andra konstruktorerna i Bostadshus och råkar i detta fall matcha Bostadshus(double l, double b, int v, boolean isol).

Dvs, this(l, b, v, true) resolvar till Bostadshus(double l, double b, int v, boolean isol)!

Permalänk
Skrivet av Dalton Sleeper:

Den kan inte ha hur många parametrar som helst helt utan vidare, det måste matcha några av de andra konstruktorerna i Bostadshus och råkar i detta fall matcha Bostadshus(double l, double b, int v, boolean isol).

Dvs, this(l, b, v, true) resolvar till Bostadshus(double l, double b, int v, boolean isol)!

Aha jag tror nu jag förstår lite grann..

Bostadshus(double l, double b, int v){ this(l, b, v, true) }

kan ha boolean true eftersom där finns konstruktor med 4 argument?

Bostadshus(double l, double b, int v){ this(l, b, v, true) }

metod kan inte användas om vi inte skapar konstruktor

Bostadshus(double l, double b, int v, boolean isol){ super(l,b,v); tilläggsisolerat=isol; }

rätt? men den metod kan användas utan

Bostadshus(double l, double b, int v){ this(l, b, v, true) }

det? Förstår jag rätt?

Permalänk
Medlem
Permalänk
Skrivet av Dalton Sleeper:

Tack för hjälp!!!:)
Men blir det inte enklare och effektivare om vi skriver boolean true eller false direkt i den metod med 4 argument?

Permalänk
Medlem
Skrivet av ProgrammeringElev:

Tack för hjälp!!!:)
Men blir det inte enklare och effektivare om vi skriver boolean true eller false direkt i den metod med 4 argument?

Det kan det visst bli, dock kan det bli enklare ur design- och kodarsynvinkel om ett standard bostadshus är isolerad by default, för vi antar väll att bostadshus (där folk ska bo) är isolerade? Men, om det skulle uppstå någon avvikelse av någon anledning, nybyggt, renovering, så går det att ändra parametern via en extra konstruktor. I vissa fall kan det vara jobbigt att behöva sätta alla parametrar varje gång man skapar ett object, ibland kan det finnas betydligt fler, som man dessutom nästan aldrig behöver bry sig om.

Permalänk
Skrivet av Dalton Sleeper:

Det kan det visst bli, dock kan det bli enklare ur design- och kodarsynvinkel om ett standard bostadshus är isolerad by default, för vi antar väll att bostadshus (där folk ska bo) är isolerade? Men, om det skulle uppstå någon avvikelse av någon anledning, nybyggt, renovering, så går det att ändra parametern via en extra konstruktor. I vissa fall kan det vara jobbigt att behöva sätta alla parametrar varje gång man skapar ett object, ibland kan det finnas betydligt fler, som man dessutom nästan aldrig behöver bry sig om.

Tack så mycket!!! Nu känner jag mycket bättre