Gå til innhold

Hvorfor skriver koden ut dette 2?


Anbefalte innlegg

Hei, jeg lurer på om noen som vet hvorfor koden nedenfor skriver ut "200, 200"?

 

/** Hva vil programmet skrive ut når det blir utført? */

public class Ting {

 

private int snr;

 

Ting(int snr) { this.snr = snr; }

 

public static void main(String[] args) {

 

Ting t1 = new Ting(100);

 

Ting t2 = t1;

 

miksfiks(t1, t2);

 

System.out.println(t1 + "," + t2);

}

 

 

private static void miksfiks(Ting tt1, Ting tt2) {

 

tt2.snr = 200;

tt1 = null;

}

public String toString() { return "" + snr; }

}

Lenke til kommentar
Videoannonse
Annonse

Du lurer på hvorfor t1 ikke er null når du skriver ut System.out.println(t1 + "," + t2); Du har jo satt tt1 = null i miksfiks-funksjonen, ikkesant?

 

Det er fordi parameterne til miksfiks er referansevariable, de inneholder adresser.

 

Når du instansierer en Ting slik

 

Ting t1 = new Ting(100);

 

... kan du tenke på det som om du får allokert en oppbevaringsboks med nummer 1234, denne adressen lagres i referansevariablen t1.

 

Ting t2 = t1;

 

Nå ligger også referanseverdien 1234 i referansevariablen t2. Så kaller du metoden din

 

miksfiks(t1, t2);

 

og den er deklarert slik:

 

private static void miksfiks(Ting tt1, Ting tt2) {

tt2.snr = 200;

tt1 = null;

}

 

Merk at denne har *sine egne* referansevariable i parameterne. "By reference" er altså egentlig "Reference by value" i Java. Du har altså nå t1, tt1, t2, tt2 som alle er referansevariable som inneholder referanseverdien 1234.

 

tt2.snr = 200;

 

Dette betyr at du setter verdien til attributtet snr på objektinstansen som ligger i oppbevaringsboksen med nummer 1234 til 200. Helt rettfram.

 

tt1 = null;

 

Men dette betyr bare at du nuller ut referanseverdien i referansevariablen tt1. t1 skjer det ingenting med, den inneholder altså referansen 1234 fortsatt (samme som t2), og instansen i den oppbevaringsboksen har verdien 200 i snr-attributtet, som du ser av utskriften ;-)

 

(Setter du t1 = null; rett før utskriften får du det resultatet du kanskje forventet.)

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å
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...