krje1980 Skrevet 4. september 2011 Del Skrevet 4. september 2011 Hei. Jeg har støtt på et program i Java som jeg ikke helt skjønner. I programmet oppretter man to objekter som får to ulike startverdier. I programmet finnes det så en metode som er som følger: static void byttVerdier(Objekt t1, Objekt t2) { Objekt t3 = t1; t1 = t2; t2 = t3; } Når man så bruker denne metoden på to objekter med to forskjellige verdier som følger: byttVerdier(Objekt 1, Objekt 2) så skulle jeg tro at verdiene ville blitt byttet om. Men verdiene forblir de samme som før. Hvorfor? Hva er det som gjør at metoden over ikke gjør at objektene bytter verdi? Setter meget stor pris på hjelp! Lenke til kommentar
torbjørn marø Skrevet 4. september 2011 Del Skrevet 4. september 2011 (endret) Når byttVerdier kalles opprettes det to nye referanser til objektene som sendes inn, disse kalles t1 og t2. byttVerdier bytter bare bare om hvilke objekter disse to referansene peker til, og dette har da bare effekt inne i den metoden. Den påvirker altså ikke referansene som finnes på utsiden. Litt vanskelig både å forklare og forstå dette her... Er ikke en kløpper i Java, men i C# har vi i alle fall et kodeord som heter ref som jeg kan benytte for å få koden til å virke. Jeg kan definere byttVerdier slik: static void ByttVerdier(ref object o1, ref object o2) { object o3 = o1; o1 = o2; o2 = o3; } Og da kan jeg bruke den slik, og det fungerer: static void Main(string[] args) { object x = "Nummer 1"; object y = "Nummer 2"; ByttVerdier(ref x, ref y); Console.WriteLine(x); // Skriver ut Nummer 2 Console.WriteLine(y); // Skriver ut Nummer 1 } Her sier vi altså på en måte at metoden skal bruke og manipulere de samme referansene som sendes inn, og ikke opprette nye. Vær forsiktig og sparsommelig med bruk av ref - det er lett å innføre feil som er problematisk å oppdage fordi metodekall gir sideeffekter som det kan være vanskelig å huske på. Update: Googlet litt, og det kan se ut som om du ikke kan gjøre det samme i java. I stedet kan du sende inn en AtomicReference<Object>. Se her! Endret 4. september 2011 av torbjørn marø Lenke til kommentar
krje1980 Skrevet 4. september 2011 Forfatter Del Skrevet 4. september 2011 Tusen takk for raskt svar! Jeg forstår nå godt hvorfor metoden ikke fungerer Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå