Gå til innhold

[Løst] Objekt-referanser og full forvirring


Anbefalte innlegg

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 av fuglecassa
Lenke til kommentar
Videoannonse
Annonse

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 av Mads-b
Lenke til kommentar

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 av Mads-b
Lenke til kommentar

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

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

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...