2010-11-17 6 views

risposta

13

In Java, si torna sempre un riferimento (a meno che il valore restituito è un tipo primitivo, come int, float, char, ...).

Quindi, se non si desidera che l'oggetto restituito da modificare, è necessario restituire una copia completa di esso (si potrebbe usare l'interfaccia e Clonableclone metodo se la classe definisce).

+5

... o l'oggetto progettato per essere immutabile. –

+0

@ Michael Borgwardt: ottimo punto. Penso che aggiungerlo alla risposta confonderà la persona che fa la domanda però ... –

+0

è un array passato per riferimento? Per quanto ne so, è un tipo primitivo, ma è mutabile. – bigblind

1

Restituisce il riferimento dell'oggetto.

supponiamo di avere una chiamata al metodo come.

Object obj = makeObject(); 

che crea un oggetto e ritorna (che è il riferimento dell'oggetto creato nel metodo makeObject).

0

1) Sì, restituisce un riferimento all'oggetto.

2) Se il metodo è privato, può essere chiamato solo all'interno della classe stessa.

3) La creazione di un oggetto final non impedisce ad altri di chiamare metodi su di esso. Esistono modi per rendere un oggetto immutabile utilizzando i pacchetti e la visibilità del metodo. (Look up come pubblico, protetto, e il lavoro privato)

4) Non c'è Object.copy()

5) Object.clone() è una bestia disordinato.

9

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

2

Cosa si dovrebbe davvero capire è che non c'è niente di speciale "passaggio" o "ritorno". Ogni volta che "passi" o "restituisci" qualcosa, passa semplicemente il valore della cosa. Periodo. Per qualsiasi tipo Ogni volta che "passi" o "restituisci" qualcosa, è esattamente come assegnarlo semplicemente a una variabile.

Tuttavia, cos'è il valore della cosa che stai passando o che stai restituendo? È qui che la tua confusione sembra mentire. La tua domanda ti chiede "restituire un oggetto"; tuttavia, una cosa del genere non ha senso in Java. Gli oggetti non sono valori in Java. È impossibile avere una variabile il cui valore è un oggetto.

Gli unici tipi in Java sono tipi primitivi e tipi di riferimento. Quindi gli unici valori sono primitivi e riferimenti. (I riferimenti sono puntatori agli oggetti.) In Java, manipoliamo solo gli oggetti tramite riferimenti (puntatori agli oggetti). Non possiamo memorizzare un oggetto in una variabile; ma possiamo memorizzare un riferimento (puntatore a un oggetto) in una variabile. Quindi, quando parli di passare o restituire oggetti, stai quasi certamente parlando di passare o restituire riferimenti. E, come detto prima, non c'è nulla di speciale nel passare o restituire riferimenti: il valore del riferimento (un puntatore) viene passato o restituito.