ABjp10 Skrevet 1. desember 2010 Skrevet 1. desember 2010 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; } }
quantum Skrevet 1. desember 2010 Skrevet 1. desember 2010 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.)
ABjp10 Skrevet 1. desember 2010 Forfatter Skrevet 1. desember 2010 Tusen takk for forklaring. Jeg henger med :-D Ha en fin kveld :-)
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å