Trädvy Permalänk
Medlem
Registrerad
Apr 2016

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..

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Sep 2012

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.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010

@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.

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003

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

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Registrerad
Apr 2016
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??

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003
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)!

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Registrerad
Apr 2016
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?

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003

@ProgrammeringElev: det låter rätt

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Registrerad
Apr 2016
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?

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Sep 2003
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.

1: Intel i7-3930K | 32GB Corsair Dominator GT | Asus Rampage IV Extreme x79 | 2 x 1080 GameRock Premium 8GB | 2 x Samsung Pro 840 512GB | Corsair AX1200i | BenQ XL2411 24" / W1070 135" | Bose QC25 | Windows 10 Pro x64 | HTC Vive |
2: Intel Core i7-4700HQ | 32GB RAM | Intel HM87 Express | GTX 780M | 17" | Windows 10 x64 |

Trädvy Permalänk
Medlem
Registrerad
Apr 2016
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