Originariamente inviato da Freax
correggetemi se sbaglio, con

codice:
String varX= new String("ciao ciao");
io ho una costante che viene clonata come variabile di istanza?

dal punto di vista della memoria, quindi, "ciao ciao" e varX, fanno riferimento a 2 indirizzi differenti con proprietà di modifica differenti ?

a dire la verità non mi è chiarissimo il concetto ma inizio a comprenderne i "margini di manovra", mi mancano gli ultimi capitoli dal libro e forse quelli mi aiuteranno
Devi partire da un concetto fondamentale riguardante le stringhe: esse sono immutabili. Cioè sono oggetti che non possono essere modificati.

Non ho ben capito cosa significhi per te "proprietà di modifica differenti", ma nel caso delle stringhe, tutte hanno la stessa capacità di modifica: nulla, assente, impossibile, niet.

Il discorso sulle stringhe in Java è piuttosto complesso, cercherò di riassumerlo:

Vi sono sostanzialmente 2 tipi di stringa: la stringa literal e la stringa non literal (se vogliamo darle un nome). Le stringhe literal sono tutte quelle che tu scrivi dentro al sorgente (ovvero, ogni volta che apri le virgolette, scrivi qualcosa e chiudi le virgolette, stai costruendo una stringa literal). Le altre (non literal) sono stringhe che provengono dall'esterno del sorgente (lette in input dalla tastiera, da un file, da una connessione via socket, ecc) e di cui, quindi, il compilatore non è a conoscenza del contenuto.

Tutte le stringhe literal finiscono nello String Literal Pool: è una lista di riferimenti, dove ciascun riferimento punta ad un oggetto String presente nello heap (come tutti gli oggetti).

Quindi, con questa istruzione

codice:
String pippo = new String("Mia Stringa");
crei due oggetti: uno è la stringa literal "Mia Stringa" (che va a finire nello String Literal Pool) e l'altro è un secondo oggetto del tutto identico al primo (dal punto di vista del contenuto), ma puntato solo dal reference "pippo".

Queste due istruzioni

codice:
String strA = "Mia Stringa";
String strB = "Mia Stringa";
creano due reference (strA e strB), che puntano entrambi all'unico oggetto presente nello heap (e puntato sempre da un reference nello String Literal Pool) perchè entrambi si riferiscono allo stesso literal.

Credo che questo documento ti possa chiarire molto le idee.


Ciao.