Gå til innhold

Kjapt spørsmål angående Java metode


Anbefalte innlegg

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
Videoannonse
Annonse

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 av torbjørn marø
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...