Quindi, per rispondere alle tue domande devi prima sapere come Java passa le variabili.
una variabile ha un valore:
int i = 1234;
Person p = new Person("Peter");
Ora, la variabile i contiene esattamente 1234, mentre il p variabile contiene la memoria Indirizzo della persona creata.
quindi i contiene 1234 e p contiene l'indirizzo (diciamo a4dfi3).
anyMethodYouLike(p);
System.out.println(p.getName());
public void anyMethodYouLike(Person somePerson) {
somePerson.rename("Homer");
}
quindi in questo esempio, diamo il metodo anyMethodYouLike alla variabile p ... wait! diamo al metodo il valore della variabile (a4dfi3). Il metodo chiama quindi rinominare su questa variabile (che ha ancora lo stesso indirizzo di p, quindi modifica la stessa persona a cui p punta). Quindi, dopo il Metodo, viene stampato il Nome della Persona p, che risulta in "Omero".
someOtherMethod(p);
System.out.println(p.getName());
public void someOtherMethod(Person somePerson) {
somePerson = new Person("Walter");
}
In QUESTO esempio, al metodo viene ancora indicato l'indirizzo della persona chiamata "Pietro". Ma questa volta, il metodo crea una nuova persona in somePerson (quindi sostituisce l'indirizzo in somePerson per ... diciamo 13n37s. MA!la persona di a4dfi3 non è stata cambiata! La chiamata stampa emette ancora "Peter" e non "Walter".
Ora, vediamo come questo si comporta con primitive:
someMethod(i);
System.out.println(i);
public void someMethod(int someInt) {
someInt++;
}
Così, il valore di i (1234) viene passato a someInteger. Quindi someInteger viene incrementato a 1235. Ma io sono ancora 1234.
Questa è la grande differenza tra Oggetti e primitive in Java.
Ora alle vostre domande: 1. Come potete leggere qui, sì Java passa sempre l'indirizzo di riferimento dell'oggetto. 2. Se non vuoi che qualcuno manipoli i valori dei tuoi Oggetti, devi prima creare un nuovo oggetto con queste informazioni (ad esempio con Cloneable e clone()), ma è un vero casino perché devi fare certo, che tutto nel tuo Oggetto che non è primitivo viene ricreato, il che è semplicemente terribile quando hai enormi strutture ad albero di oggetti.
Spero di poter aiutare, Ferdi265
... o l'oggetto progettato per essere immutabile. –
@ Michael Borgwardt: ottimo punto. Penso che aggiungerlo alla risposta confonderà la persona che fa la domanda però ... –
è un array passato per riferimento? Per quanto ne so, è un tipo primitivo, ma è mutabile. – bigblind