notsohard4get Skrevet 23. april 2013 Del Skrevet 23. april 2013 (endret) Hei! public class App { public App() { String a = new String("4"); String b = a; a = "8"; System.out.println(b); } public static void main(String[] args) { new App(); } } Terminalen skriver nå "4". Dette forstår jeg ikke, skal ikke nå "b" ha blitt et referanse til "a"? Noe som skulle ha skrevet "8"? Endret 23. april 2013 av fuglecassa Lenke til kommentar
Mads-b Skrevet 23. april 2013 Del Skrevet 23. april 2013 (endret) Hei! public class App { public App() { String a = new String("4"); String b = a; a = "8"; System.out.println(b); } public static void main(String[] args) { new App(); } } Terminalen skriver nå "4". Dette forstår jeg ikke, skal ikke nå "b" ha blitt et referanse til "a"? Noe som skulle ha skrevet "8"? Du er forvirret av for mye shorthand. På linje 7 har du nå egentlig skrevet a = new String("8"); Dermed har du satt a til å referere til et annet objekt enn b. Huskeregel: Hver gang du bruker '=' med en variabel, endrer du referansen. Endret 23. april 2013 av Mads-b Lenke til kommentar
Sokkalf™ Skrevet 23. april 2013 Del Skrevet 23. april 2013 http://javarevisited.blogspot.no/2010/10/why-string-is-immutable-in-java.html Lenke til kommentar
notsohard4get Skrevet 23. april 2013 Forfatter Del Skrevet 23. april 2013 Hva referer b til nå da? Og hvordan forandrer jeg verdien til a, mens b fortsatt referer til a? Lenke til kommentar
Mads-b Skrevet 23. april 2013 Del Skrevet 23. april 2013 (endret) Hva referer b til nå da? Og hvordan forandrer jeg verdien til a, mens b fortsatt referer til a? b refererer til objektet a var. For å endre verdien til objektet mens begge variablene er referanser til det, må du bruke metoder som endrer objektet. Dessverre er String by-design umulig å endre etter at den er laget, så du må finne deg et annet objekt å leke med, som kan endres etter at det er laget. EDIT: Et eksempel: AtomicInteger a = new AtomicInteger(0); AtomicInteger b = a; a.set(42); System.out.println(b.get()); // Returnerer 42. b.set(43); System.out.println(a.get()); // Returnerer 43. Endret 23. april 2013 av Mads-b Lenke til kommentar
GeirGrusom Skrevet 23. april 2013 Del Skrevet 23. april 2013 Hva referer b til nå da? Og hvordan forandrer jeg verdien til a, mens b fortsatt referer til a? Kanskje dette er litt forvirrende, men det er mye enklere enn du tror det er. a og b er referanser til objekter, men de er ikke på noe tidspunkt referanser til hverandre. Når du setter b = a, så kopierer du referansen som a inneholder inn i b. Du oppretter ikke noen referanse til a. a er dermed fullstendig uavhengig av verdien i b og omvendt. De kan peke til samme objekt, men de kan ikke peke på hverandre. x=y betyr at man kopierer verdien i y over i x. Dersom x er en referansetype (slik som string) så kopierer man referansen fra y over i x. På ingen tidspunkt blir x en referanse til y. Lenke til kommentar
_Xorcist Skrevet 28. april 2013 Del Skrevet 28. april 2013 Du bør aldri kalle new String(). Brukbart forklart her: http://stackoverflow.com/a/334580/1853306 Som andre i tråden sier kan ikke et String-objekt endre seg når det først eksisterer. Det er "immutable". Det er overhodet ikke synd at det er immutable, tvert i mot skulle jeg ønske at mange flere objekter i Java var det ettersom det er veldig mange problemer og bugs du kan stelle i stand hvis objekter kan endre seg. Immutable objekter er bl.a. thread-safe by design. Les gjerne mer om det her: http://www.javapractices.com/topic/TopicAction.do?Id=29 Lenke til kommentar
notsohard4get Skrevet 30. april 2013 Forfatter Del Skrevet 30. april 2013 Ah, jeg skjønner nå :-) Tusen takk for svar, eksamen om 14 dager 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å