2010-11-17 17 views

Respuesta

13

En Java, siempre devuelve una referencia (a menos que el valor devuelto sea un tipo primitivo como int, float, char, ...).

Por lo tanto, si usted no desea que el objeto devuelto a ser modificado, que debe devolver una copia completa del mismo (que podría utilizar Clonable interfaz y clone método si su clase define).

+5

... o el objeto está diseñado para ser inmutable. –

+0

@Michael Borgwardt: buen punto. Creo que agregarlo a la respuesta confundirá a la persona que hace la pregunta ... –

+0

es una matriz pasada por referencia? Hasta donde yo sé, es un tipo primitivo, pero es mutable. – bigblind

1

Devuelve la referencia del objeto.

Supongamos que tiene una llamada a un método como.

Object obj = makeObject(); 

que crea un objeto y devuelve (que es la referencia del objeto creado en el procedimiento makeObject).

0

1) Sí, devuelve una referencia al objeto.

2) Si el método es privado, solo se puede invocar desde la propia clase.

3) Hacer un objeto final no impide que otros invoquen métodos en él. Hay formas de hacer que un objeto sea inmutable mediante el uso de paquetes y la visibilidad del método. (Buscar la manera pública, protegida, y el trabajo privado)

4) No hay Object.copy()

5) Object.clone() es una bestia desordenado.

9

Por lo tanto, para responder a sus preguntas, primero debe saber cómo pasa Java las variables.

una variable tiene un valor:

int i = 1234; 
Person p = new Person("Peter"); 

Ahora, la variable i contiene exactamente 1.234, mientras que la variable p contiene la Dirección de memoria de la persona creada.

entonces yo contiene 1234 yp contiene la dirección (digamos a4dfi3).

anyMethodYouLike(p); 
System.out.println(p.getName()); 
public void anyMethodYouLike(Person somePerson) { 
    somePerson.rename("Homer"); 
} 

por lo tanto, en este ejemplo, le damos al método anyMethodYouLike the Variable p ... ¡espere! le damos al Método el valor de la Variable (a4dfi3). El método llama a renombrar en esta variable (que todavía tiene la misma dirección que p tiene, por lo tanto, modifica la misma persona a la que apunta p). Entonces, después del Método, se imprime el Nombre de la Persona p, lo que da como resultado "Homer".

someOtherMethod(p); 
System.out.println(p.getName()); 
public void someOtherMethod(Person somePerson) { 
    somePerson = new Person("Walter"); 
} 

En ESTE ejemplo todavía damos la dirección de nuestra Persona llamada "Peter" al Método. Pero esta vez, el método crea una nueva persona en somePerson (por lo tanto, anula la dirección en somePerson a ... digamos 13n37s. PERO!¡La Persona en a4dfi3 no fue cambiada! La llamada de impresión sigue produciendo "Peter" y no "Walter".

Ahora, vamos a ver cómo se comporta con las primitivas:

someMethod(i); 
System.out.println(i); 
public void someMethod(int someInt) { 
    someInt++; 
} 

Por lo tanto, el valor de I (1234) se pasa a someInteger. Entonces, un poco más se incrementa a 1235. Pero todavía estoy 1234.

Esta es la gran diferencia entre los objetos y las primitivas en Java.

Ahora a sus preguntas: 1. Como puede leer aquí, sí Java siempre pasa la Dirección de referencia del Objeto. 2. Si no quiere que alguien altere los valores de sus Objetos, primero tiene que crear un Objeto nuevo con esa información (por ejemplo, con Cloneable y clonar()), pero es un verdadero desastre porque tiene que hacer seguro, que todo en tu Objeto que no es primitivo se vuelve a crear, lo cual es horrible cuando tienes enormes estructuras de árbol de objetos.

espero poder ayudar, Ferdi265

2

Lo que realmente debe darse cuenta es que no hay nada especial acerca de "pasar" o "volver". Cada vez que "pasa" o "devuelve" algo, simplemente pasa el valor de la cosa. Período. Para cualquier tipo. Cada vez que "pasa" o "devuelve" algo, es exactamente lo mismo que simplemente asignarlo a una variable.

Sin embargo, ¿qué es el valor de lo que está pasando o está devolviendo? Ahí es donde tu confusión parece estar. Su pregunta se refiere a "devolver un objeto"; sin embargo, tal cosa no tiene sentido en Java. Los objetos no son valores en Java. Es imposible tener una variable cuyo valor sea un objeto.

Los únicos tipos en Java son los tipos primitivos y los tipos de referencia. Por lo tanto, los únicos valores son primitivos y referencias. (Las referencias son punteros a objetos). En Java, solo manipulamos objetos a través de referencias (punteros a objetos). No podemos almacenar un objeto en una variable; pero podemos almacenar una referencia (puntero a un objeto) en una variable. Entonces, cuando hablas de pasar o devolver objetos, casi con seguridad hablas de pasar o regresar referencias. Y, como se dijo antes, no hay nada especial en pasar o devolver referencias: el valor de la referencia (un puntero) se pasa o se devuelve.

Cuestiones relacionadas