Java Programmering - 6. del

Tags:    java
Skrevet af Bruger #4487 @ 19.12.2010

Indledning


I denne 6. del skal vi begynde at lære om nedarvning (inheritance på engelsk). Vi skal også til sidst høre om pakker (packages på engelsk)

Nedarvning (Inheritance)


Lad os f.eks. sige at vi har et program, som kan indeholde objekter af klasserne CD og DVD, i en Database klasse. Man kan sige at Database klassen har en relation til CD klassen, og DVD klassen, fordi den kan holde objekter af netop disse to klasser, eller på anden måde benytter disse to klasser. Man kan vise relationerne imellem klasserne i et relations klasse diagram, og sådan et diagram kunne se ud som billedet nedenunder.



Dette klassediagram viser at der er relationer imellem CD klassen og Database klassen, og DVD klassen og Database klassen. Når man taler om nedarvning, skal man kunne definere en overklasse over nogle andre klasser. Vi kunne f.eks. prøve at få klasserne CD og DVD til at blive nedarvet af en overklasse. Denne overklasse skal man kunne sige følgende om - En CD eller DVD er en... - Netop dette er en... er vigtigt, da man ikke kan tale om nedarvning, hvis ikke at klasserne kan fortolkes til at være noget over deres egentlige definition. En overklasse til CD og DVD kunne f.eks. være Ting. Man kan nemlig sige sætningen - En CD og en DVD er en ting, dette giver perfekt mening for os, og fungere derfor rigtig godt som en overklasse for underklasserne CD og DVD. Vores database vil nu have en relation til overklassen Ting istedet for både CD og DVD. Når man skal vise at en klasse er nedarvet fra en anden klasse, skal man lave en pil imellem klasserne. Vores klasse diagram ser nu således ud.



Nu kan man tale om nedarvning, da CD og DVD er en ting, og Database klassen holder nu ikke objekter af CD'er og DVD'er, men af Ting klassen, som er overklassen til underklasserne CD og DVD. Nu kan du tænke, hvad er det smarte ved at benytte nedarvning, og til dette kan jeg fortælle at overklassen, kan indeholde generelle ting, som går igen i både CD klassen, og DVD klassen. lad os tage nogle eksempler. Både CD'er og DVD'er har en titel og en spilletid, og derfor behøver vi kun at lave felter for dette i Ting klassen, frem for både CD og DVD klassen. På denne måde sparer vi tid, kode og vi får automatisk også et bedre og mere overskueligt design. Felterne i CD klassen kunne være henholdsvis artist og antal musik numre. Felterne i DVD klassen kunne henholdsvis være instruktør og genre. Dette er de individuelle felter, og skal derfor være i henholdsvis DVD og CD. De generelle felter som både er i DVD og CD, skal jo være i vores Ting klasse. Lad os nu prøve at lave vores klasser

Lad os begynde på koden


Vi skal have fire forskellige klasser, nemlig Database, Ting, CD og DVD. Så opret en ny mappe til alle dine klasser, og lad os starte med at lave Ting klassen. Klassen Ting, skal have de to omtalte felter fra før, og en konstruktør som initialisere disse felter. I konstruktørens parameterfelt, laver du så 2 parameter, en for titel, og en for spilletid, og initialisere så parametrene til vores felter. Vores Ting klasse ser nu således ud.
Fold kodeboks ind/udJava kode 

Så skal vi bare lave 2 accessor metoder, som henter indholdet fra titel og spilleTid. De er heldigvis lette for os at lave, og husk de skal være public.
Fold kodeboks ind/udJava kode 

Nu skal vi så lave CD og DVD klasserne. Det smarte ved nedarvning var at de arvede felterne fra Ting klassen, men de arver også metoderne fra Ting klassen. Så metoderne hentTitel() og hentSpilleTid() kan nu kaldes i CD og DVD klasserne som om at de var i disse klasser.

Lad os først begynde på CD klassen. Lav klassen, og giv den en konstruktør. Giv den felterne artist og antalNumre, og lav nu 2 accessor metoder til hvert af felterne. Koden ser nu således ud.
Fold kodeboks ind/udJava kode 


Extends og Super nøgleordene


CD klassen er ddesværre ikke nedarvet af Ting klassen endnu. Det er den ikke da vi ikke har fortalt Java at denne klasse skal være en underklasse til Ting klassen. Det er her vi skal bruge nøgleordet extends, som fortæller Java at denne klasse er en udvidelse (extension) til Ting klassen. Så i starten af vores klasse skal vi udvide vores klassedefinition, fra at hedde public class CD, til at hedde public class CD extends Ting. Før fortalte vi i klassedefinitionen at dette bare var en klasse, som hed CD, men med extends foræller vi pludselig Java at dette er en klasse der hedder CD, som er udvidet/nedarvet af klassen Ting. Så du kan hurtigt lige ændre dette i vores CD klasse.

Når vi har fortalt Java at denne klasse (CD) er en udvidelse af Ting klassen, så er vi begyndt at bruge begreberne underklasser og overklasser (superklasser). Superklassen er en Ting, og underklassen er CD. Vi skal derfor kende endnu et nøgleord, som er ordet super. Nøgleordet super kalder automatisk superklassens konstruktør, og vi kan på den måde lægge information ind i vores superklasse, fra underklassen. Så i CD klassens konstruktør skriver du - super() - og i super's parentes skriver du Ting klassens parametre, altså det som du ville skrive hvis du skulle lave et objekt af klassen Ting. Lad os se på et eksempel af CD klassen nu, og jeg vil bagefter forklarer hvordan jeg har deklareret min super.
Fold kodeboks ind/udJava kode 

Du kan her se at jeg har kaldt min superklasses konstruktør i CD klassens konstruktør, og ved hjælp af parametre fra CD klassen konstruktør, lægger jeg værdier ind i min superklasses konstruktør. Husk også at når du kalder en superklasses konstruktør, skal den kaldes som det første i din konstruktør. Så parametrene titel og spilleTid bliver automatisk lagt ind i min superklasse Ting.

Udfordrings Opgave - Lav nu din DVD klasse, med felterne instruktør og genre, og 2 accessor metoder til hvert af felterne. Lad nu klassen blive udvidet med nøgleordet extends til Ting klassen, og kald så din superklasses konstruktør i DVD klassen konstruktør, og udfyld den med parametre, ligesom i CD klassen. Når du har løst opgaven, så sammenlign med min.
Fold kodeboks ind/udJava kode 

Nu har vi 2 klasser, som bliver extends klassen ting, altså udvider og dermed arver fra klassen ting. Vi kan nemlig bruge alle de metoder, som er public i vores klasse ting, uden at skulle referere til et objekt af klassen Ting først.

Database klassen


Lad os nu prøve at lave vores Database klasse, som skal indeholde vores CD'er og DVD'er (Ting) i en kollektion.

Udfordrings Opgave - Lav klassen Database, og deklarer et felt til ArrayList, som du initialisere til at indeholde et objekt af arrayList. Lav så nu en public mutator metode som hedder tilfojTing, med en parameter. Parameteren skal være et objekt af vores klasse Ting. Signaturen ser således ud, private void tilfojTing(Ting t). Metoden skal være tom indtil videre. Lav også en anden mutator metode, som er public og hedder udskrivListe, og har nul parametre. Når du har lavet dette ser vores Database klasse således ud.
Fold kodeboks ind/udJava kode 

Vi skal nu have lidt indhold i vores to metoder. Lad os starte med vores tilfojTing(Ting t) metode. Denne metode havde til formål at tilføje ting til vores liste. Fra de forgående artikler, ved vi at vores ArrayList har en metode der hedder add, til netop dette formål, så lad os bruge denne metode. Husk at parameteren er vores objekt, som skal lægges ind i listen. vores metode ser nu således ud.
Fold kodeboks ind/udJava kode 

Nu den anden metode, som havde til formål at udskrive vores objekter i listen. Til denne opgave, kan vi benytte en løkke. For each løkken er et udmærket valg til denne type af opgaver, da den selv stopper, når der ikke er flere objekter tilbage i vores kollektion/liste. Så vores signatur for vores for each løkke ser således ud - for (Ting t : tingKollektion) - I løkkens krop skal vi så lave et println statement, som udskriver vores objekt, som er gemt i den lokale variabel t, som blev defineret i vores for each løkke. Vores udskrivListe metode ser nu således ud.
Fold kodeboks ind/udJava kode 

Vores Database klasse er nu egentlig klar, og vi kan begynde at lave vores Main, som skal kalde Database klassens metoder tilfojTing(Ting t), og udskrivListe. Vi skal i vores Main klasses main metode lave nogle kald til Database klassens tilfojTing(Ting t) metode, hvor parameteren skal være et nyt objekt af vores forskellige ting, i dette tilfælde enten CD eller DVD. Husk at bruge new nøgleordet til at lave nye objekter af disse klasser. Når vi har tilføjet objekter til vores liste, skal vi jo kalde metoden udskrivListe(), fra Database klassen, for at udskrive vores liste til skærmen. Jeg vil dog gerne lige pointere noget med hensyn til vores tilfojTing metode. Vi har jo lært at når vi har givet en generisk type til vores ArrayList (I dette tilfælde typen Ting), så kan listen kun indeholde objekter af denne klasse, men fordi at vores CD og DVD klasse er nedarvet af klassen Ting, så er de altså også en del af Ting, og vi kan derfor godt lægge objekter af klasserne CD og DVD ind i vores kollektion med den generiske type Ting.

Nå, men nu videre til vores Main klasse. kald som nævnt ovenover Database klassens metoder i vores main metode, og når dette er gjort, skulle din Main klasse gerne se således ud.
Fold kodeboks ind/udJava kode 

Nu kan du kompilere dine klasser, og herefter køre din Main klasse. Men hov, hvad er nu det, der bliver udskrevet nogle underlige til på skærmen, men ikke de informationer vi havde i vores CD og DVD klasser. Dette er ikke så underligt, da Java kun gør som den får besked på. Java udskrive nemlig en liste over vores objekter, og det er præcis det den gør her. Vores output ser således ud, eller næsten.



Den udskrive klassens navn @ nogle underlige tal. Dette er en reference til vores objekt. nemlig hvilken slags objekt her er tale om, og hvor på vores memory den ligger. Grunden til at Java overhovedet udskriver noget, er fordi at alle klasser vi laver arver fra klassen Objekt. Hver eneste gang vi laver en klasse, vil den automatisk af Java blive til en underklasse af klassen Objekt. Denne klasse har så en metode som hedder toString, som udskriver - klasensNavn@hashCode - Java vil automatisk lede efter denne metode, hvis ikke andet er anført (altså der gives en anden String til vores println). Nu tænker du hvad skal vi dog så bruge dette til, når nu vi får en for os ubrugelig udskrift, som ikke viser vores data om CD'er og DVD'er, og hvordan løser vi det. Vi kan løse det nemt, men først skal vi vide lidt om noget man kalder overriding.

Overriding


Når man vil override noget, så er det simpelt og nemt. Forestil dig at vi vil udskifte Objekt klassen toString metode, sådan så Java bruger vores egen toString metode istedet. Java leder efter den nærmeste toString metode for vores objekt, og da vi ikke har lavet nogen vil den så bruge Object klassens toString metode.
Vi kan løse dette let, da alt vi skal gøre er at lave en toString metode i hvert af vores CD og DVD klasse. Husk at succeskriteriet for at override, er at metodens signatur/header er helt ens, men indholdet i metoden behøver ikke være ens.

Mini opgave - Åben dit Java Bibliotek, og find klassen Object. Når du har fundet klassen, så find dens metode, som hedder toString(). Hvordan ser toString() metodens signatur/header ud, og hvad er dens return type. Når du kan svare på disse spørgsmål, så læs videre.

I object klassen, kan vi finde metoden toSTring(), som har følgende signatur - public String toString() - Dens returns type er en String, og metoden er public og hedder toString() uden nogle parametre. Når vi ved dette skal vi sådan set bare lave en metode, med præcis denne signatur, i vores CD og DVD klasse, og vores toString() metodes krop, skal vi returnere en String med de forskellige oplysninger, som DVD og CD skal udskrive. Lad os starte med at lave metoden til CD klassen.

Opgave - Lav en toString metode med signaturen - public String toString(), og i dens krop, skal du returnere indholdet i et objekt af klassen CD (artist, antalNumre osv.) Når du har løst denne opgave, så sammenlign med min.

Fold kodeboks ind/udJava kode 

Som du måske har bemærket, kalder vi metodern hentTitel() og hentSpilletTide(), som om at de var i vores CD klasse, selvom de rent faktisk er i Ting klassen. Dette kan vi fordi at CD er en Ting, altså den arver simpelthen alle metoder i klassen Ting, som er public.

Opgave - Lav nu også en toString() metode ligesom vi gjorde i CD klassen, men denne gang, lav den i DVD klassen.
Sammenlign med min kode, når du er færdig.

Fold kodeboks ind/udJava kode 

Du kan nu kompilere dine filer, og køre din Main fil igen, og resultatet skulle nu være som billedet nedenunder.



Husk at overriding kun kan bruges på klasser der arver fra hinanden, men da alle klasser arver fra Object klassen alligevel, så er det nemt at override dens metoder.

Statiske og Dynamiske typer


I vores eksempel fra før har vi gemt objekter af klasserne CD og DVD, men i vores (ArrayList) kode har vi skrevet at vi gemte objekter af typen Ting. Vi ved nu også at dette sagtens kan lade sig gøre, da vi har lavet en nedarvning af CD og DVD klassen, som nu også er en Ting. Men hvordan ved Java hvilken type som er CD og hvilken type som er DVD i vores liste med Ting? Det er her vi skal vide lidt om statiske (Static type) og dynamiske (Dynamic type) typer. Den statiske type i vores eksempel er den type som er angivet i vores kode, som i dette tilfælde er typen Ting. Når vi kan se i koden at vores liste indeholder objekter af Ting, bliver vores statiske type altså til typen Ting. Vores dynamiske type er så den type vi ikke direkte kan se, men som faktisk er den type, som gemmes i vores liste. Vi ved jo at vi gemmer objekter af data typen CD og DVD, men vi kan jo kun se i koden at vi kan gemme objekter af typen Ting. Når vi ikke direkte kan se det, men vi ved at Java kan se at det er typer af CD og DVD og ikke direkte Ting vi gemmer, kalder vi typen for dynamisk, fordi den kan være noget andet end der er vist i koden.

Nu tænker du, hvorfor skal jeg dog vide den slags, og til det kan jeg fortælle at det altid er godt at vide noget fagligt, selvom man ikke direkte bruger det i koden. Faktisk har denne faglige viden også en anvendelighed for vores eksempel, fordi vi kan lave et tjek af den dynamiske type, inden vi udskriver den. Måden man laver sådan et tjek på, er ved at benytte et nøgleord i Java. Nøgleordet er instanceof, og bruges altså til at tjekke om et givent objekt er et objekt (instance) af en given klasse. Vi kan f.eks. lege at vi har en lokal variabel der hedder obj, og som indeholdet et objekt af typen DVD. Vi kan nu lege at vi vil tjekke om variablen obj, indeholder et objekt af klassen CD. Dette kan vi vælge at gøre i en if statement. Vores tjek kunne ku se således ud i kode.
Fold kodeboks ind/udJava kode 

Vores tjek vil selvfølgelig returnere falskt, og undlade at køre indholdet i if statementet, da vores DVD objekt i variablen obj, ikke er et objekt af klassen CD.

Tilbage til vores eksempel


Lad os nu benytte noget af den viden vi har tilegnet os i vores eksempel, og lave et tjek i vores udskrivListe() metode i Database klassen, som tjekker om vores objekt vi har fundet i vores kollektion er af den dynamiske type CD eller DVD, hvorefter vi laver noget specielt (Vi kunne f.eks. lave et ekstra println statement, som skrev DVD eller CD).

Opgave - Brug nøgleordet instanceof i en if statement, i vores løkke i metoden udskrivListe(). Lav først et tjek for om objektet er af klassen DVD, og hvis ikke den er det, så skriv i din else del det som skal udskrives for CD. Når du har løst opgaven, så sammenlign med min.
Fold kodeboks ind/udJava kode 

Kompiler og kør nu din kode, og tjek så at det virker.

Hvad er fordelene ved nedarvning


Fordelene ved nedarvning kan først og fremmest være overskuelighed og struktur. Det bliver pludselig nemmere at bruge flere objekter i sine kollektioner. Men en af grundfordelene ved nedarvning, er at det pludselig bliver langt nemmere at tilføje en klasse til vores hierarki. Det er nemmere, fordi vi allerede har defineret nogle generelle felter for vores Ting, og vi kan derfor nemmere tilføje en ny klasse, som også har brug for netop disse felter. Et eksempel på dette kunne være at vi ville udvide vores program, til også at indeholde objekter af en klasse vi kunne definerer som Videospil. Dette er nu utroligt nemt, da alt vi skal gøre er at definere nogle unikke felter for videospil, da alle de generelle allerede er defineret for os. Det er pludselig også nemmere at genbruge kode/metoder, da alle vores underklasser, arver metoderne fra superklassen. Vi undgår også at få alt for meget duplikerende kode (Kode der er ens), da vi arver fra superklassen, og ofte bare kan vælge at lave metoden der. Vi kan stille fordelene op i et punksystem for overskuelighedens skyld.

  • Lettere at tilføje klasser til vores hierarki

  • Genbrug af metoder er meget nemmere, da vi arver dem fra superklassen.

  • Kode duplikation kan nemmere undgås, da vi arver meget fra superklassen, og derfor ikke behøver at definere det igen



Protected


Vi har allerede lært lidt om to access modifiers, som hedder public, og private. Ved ved at ting, som er angivet private, kun er tilgængelige inde i klassen. Altså det er kun klassen, som kan arbejde med private felter, eller metoder. Hvorimod at public er stik modsat. Når noget er angivet public, så kan alle klasser få adgang til dette (oftest metoder). Man hvad nu hvis jeg siger at der er en access modifier midt imellem public og private, fordi det er der nemlig. Denne access modifier hedder protected, og når noget bliver angivet som værende protected, så er det halvt private, og halvt public. Det kan lyde lidt mærkeligt, men lad mig prøve at demonstrere det med en model.



Modellen viser at public gør at alle klasser i programmet for adgang til det, mens private kun er tilgængeligt fra klassen selv. Protected derimod er tilgængeligt i alle klasser, som er en del af vores generaliserings struktur (Nedarvnings hierarki). Det betyder at hvis vi erklærer en metode i f.eks. Ting klassen for protected, så vil den stadig være tilgængelig for underklasserne, men den vil være utilgængelig for vores klasse som ikke er med i vores hierarki (Klient i vores model). Ligeledes hvis en metode i vores CD eller DVD klasse, var angivet protected, så vil den stadig være tilgængelig for vores superklasse, men aldrig for vores klient, eller andre, som ikke er en del af hierarkiet.

Opgave - Prøv nu at gøre alle vores 'hent' metoder protected i henholdsvis CD, DVD og Ting klasserne. Du må ikke gøre toString() metoden protected. Når du har gjort dette, vil dine tre klasser (CD, DVD og Ting) se således ud i koden.
Fold kodeboks ind/udJava kode 


Fold kodeboks ind/udJava kode 


Fold kodeboks ind/udJava kode 

Nu da vores hent metoder er protected gør det ikke noget direkte, men det er en god ide at tænke over tilgængeligheden, når man programmerer større programmer, da det mindsker risikoen for at man får adgang til en metode et sted, hvor det var forbudt.

Ekstra Opgave


Nu da vi har lært en hel masse om nedarvning, og klasse hierarki, kan vi prøve at udvide vores program, til at indeholde en ny Videospil klasse, som skal være en underklasse til vores Ting. Så vi skal gøre følgende.

  1. Lav en klasse kaldet Videospil, og gør den til en underklasse af Ting klasse.

  2. Tænk over nogle unikke ting som kendetegner Videospil (f.eks. antal spillere osv.), og lav så disse til felter i Videospil klassen, med nogle hent metoder, som er protected.

  3. I Database klassens udskrivListe() metode, skal du slette else delen, og lave endnu et tjek også for CD'er, og til sidst et tjek for også Videospil, sådan så vi i alt har tre tjek på om objektet er en instanceof vores tre klasser. Lav en passende tekst, som skrives ud hvis tjekket er sandt.

  4. I din Main klasse, skal du tilføje nogle Videospil objekter til listen, så vi får udskrevet nogle Videospil også

  5. Kompiler nu dine filer, og kør så din Main fil.


Når du har løst dette skulle dit output gerne vise nogle Videospil også. Du kan herunder se koderne til de berørte klasser, og sammenligne den med hvad du har lavet.
Fold kodeboks ind/udJava kode 


Fold kodeboks ind/udJava kode 


Fold kodeboks ind/udJava kode 


Pakker (Packages)


Pakker har vi også allerede beskæftiget os med, endda også i de foregående artikler. Hver eneste gang vi bruge import statementet, skrev vi en sti til en klasse, som skulle importeres til vores program. Hvis vi f.eks. skulle bruge klassen ArrayList, skrev vi stien: java.util.ArrayList;. Klassen heddder ArrayList, mens pakken som klassen ligger i hedder java.util. Der findes mange andre pakker i Java biblioteket, og du kan se dem allesammen med at gennemgå dit bibliotek.

Lav dine egne pakker
Du kan selvfølgelig også lave dine egne pakker, hvor du kan lægge klasser i. For at løse dette skal vi bruge et nyt nøgleord, som er packages og også skal skrives som noget af det første i din Java fil. Når man skal lave en pakke, skal man laver en folder og lægge de klasser man laver i denne folder. Lad os f.eks. sige at vores pakke skal hedde pakkeTest, så skal vores folder altså hedde pakkeTest og klasserne i denne pakke skal så starte med nøgleordet - package pakkeTest; - for at angive at denne klasse er en del af pakken/folderen pakkeTest.

Opgave - Lav en folder og kald den for pakkeTest. I denne folder laver du to klasser (TestEt og TestTo), og giver begge klasser en public mutator metode, som laver en System.out.println() statement, med noget valgfrit tekst. Du kunne f.eks. kalde metoden for udskriv(). Husk at skrive package pakkeTest; i starten af begge klasser. Når opgaven er fuldført, så ser vores to klasser således ud.

Fold kodeboks ind/udJava kode 


Fold kodeboks ind/udJava kode 


Vi kan nu lave vores Main metode i folderen inden folderen pakkeTest, så hvis vores folder pakkeTest ligger i en folder der hedder JavaProjects, så skal din Main fil altså ligge i JavaProjects.

Opgave - Lav nu en Main java fil, og giv den en import statement, hvor vi importerer pakken pakkeTest og alt dens indholde. Vi kunne skrive import pakkeTest.TestEt; og endnu en for TestTo, men hvis man vil importere alle klasserne uden at skulle skrive dem allesammen enkeltvis, så kan man bare skrive en stjerne i stedet, så vores import statement ser således ud - import pakkeTest.*; - I vi importerer alle klasserne i pakken pakkeTest. Din Main fil, skal selvfølgelig indeholde en main metode, der har to lokale variabler, med et objekt af TestEt og TestTo klasserne. Kald nu herefter TestEt og TestTo's udskriv metoder, med dot notation. Din Main klasse ser nu således ud.
Fold kodeboks ind/udJava kode 


Vi har nu importeret en pakke med klasser, som vi selv har lavet, og hvis du kompiler og kører Main filen, skulle den gerne udskrive de to statements i hver vores to klasser.

Man bruger ofte egne pakker, når programmet er stort eller skal opdeles så det bliver mere overskueligt. Det kunne være at man havde lavet en masse klasser, måske op til hundreder. Så er det nemmere og mere overskueligt for programmøren, hvis man grupperer klasserne i pakker.



Læs med i næste artikel for at lære meget mere om Java Programmering

Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (6)

User
Bruger #16945 @ 13.03.12 12:51
Øøøh, mener ikke du har gennemgået "this" metoden..

Fold kodeboks ind/udJava kode 


Eller også er det bare mig som ikke har fulgt ordentligt med. Men kan du forklare hvad det er?
User
Bruger #4487 @ 13.03.12 13:35
Mhh... det kan godt være at jeg har glemt dette i farten, har ikke lige gennemtjekket det :)

this nøgleordet er en reference til objektet selv. Alle klasser er en slags templates for dens objekter. Det betyder at alle objekter kan bruge metoderne, variablerne mm. der er lavet i objektets klasse. Ønsker man så specifikt at gøre java opmærksom på at vi ønsker at bruge 'dette objekts' objekt variabel f.eks. kan vi bruge nøgleordet this.

Eksemplet med konstruktøren Ting(titel, spilleTid), bruger nøgleordet this, til at fortælle java at 'dette objekts' objekt variabel kaldet titel, skal tildeles med værdien i parameteren titel. Bemærk at vi bruger samme variabel navne på vores objekt variabel, som hedder titel, og vores parameter variabel der hedder titel. Måden vi kan fortælle java at parameter variablen skal tildeles til objektets variabel titel, er ved at bruge this nøgleordet - husk på at this betød 'dette objekt'. Skriver vi altså konstruktøren uden this nøgleordet
Fold kodeboks ind/udJava kode 

Vil metoden gøre dette at den vil tildele værdien fra parameter variablen titel til sig selv (parameter variablen titel), og ligeledes med varaiblen spilleTid. Variabler givet som parameter fungerer nemlig som lokale variabler for den metode de er givet til. Det er også derfor at du kan bruge parameter variablen inde i selve metoden. Java vil helst arbejde så lokalt som muligt, så hvis vi giver en objekt variabel og en parameter variabel samme navn, så vil java tro at vi kun snakker om parameter variablen, med mindre at vi specifikt fortæller java at parameter variablen titel, skal tildeles 'dette objekts' objekt variabel kaldet titel.

Håber at det gav lidt mening :)
User
Bruger #16945 @ 15.03.12 17:29
Og jeg går ud fra at "this" kun er noget man bruger når man bruger nedarvning? Eller er jeg ude og svømme? : )
User
Bruger #4487 @ 15.03.12 17:41
Ja, du er også ude at svømme her :P

this betyder dette objekt, og kan angives i alle klasser, også selvom at de ikke arver fra andre klasser. Det refererer bare til objektet af denne klasse. Du kan altså i en helt almindelig klasse benytte this således
Fold kodeboks ind/udJava kode 

Bemærk at jeg benytter this fordi objekt variablen hedder name, og det gør parametrende i metoderne også. Jeg kunne dog undlade this i getName() metoden, da denne jo ikke har noget parameter med navnet name.
User
Bruger #16945 @ 18.03.12 08:31
Hmm. Er stødt på et nyt spørgsmål, hvordan kan det være at man skal en privat klasse variabel, i konstruktøren?

Fold kodeboks ind/udJava kode 


Det koden gør, er vel bare at sige, titel = titel? Kan bare ikke forstå hvorfor man skal bruge this..
User
Bruger #16945 @ 18.03.12 08:36
Har tænkt lidt over det, og tænker på om den her kode er legal:

Fold kodeboks ind/udJava kode 
Du skal være logget ind for at skrive en kommentar.
t