2010-10-04 20 views
5

Digamos que establezco int A = int B. Cuando cambio A después, no cambiará el valor de B. Pero cuando configuro SomeClass A = SomeClass B, y cambio el contenido de A (como a.cost), cambia B.cost también. ¿Alguien me puede explicar esto?Asignando en Java?

Pensé que Java se asigna por valor, no de referencia?

Respuesta

19

Sí, lo hace, pero el valor de A es una referencia, no una copia del objeto en sí.

me gusta dar la siguiente analogía ...

Supongamos que dos personas ambos tienen mi dirección: eso es como dos variables de tipo House en Java. Ahora uno de ellos viene y pinta mi puerta de rojo. La segunda persona seguirá viendo la puerta roja si se visita:

House jonsHouse = new House(); // Even the variable jonsHouse is only a reference 

House firstAddressCopy = jonsHouse; // Just a copy of the reference 
House secondAddressCopy = jonsHouse; // Just a copy of the reference 

firstAddressCopy.paintDoor(Color.Red); 

Color color = secondAddressCopy.getDoorColor(); // Now color will be red 

Básicamente, recordar algunas reglas y las cosas se vuelven claras:

  • el valor de una expresión en Java es Nunca una objeto - sólo alguna vez una referencia o un valor primitivo
  • (Corolario del primer punto) una variable nunca se lleva a cabo un objeto - sólo alguna vez una referencia o un valor primitivo
  • Asignación (y el argumento de pasada) siempre copia el valor, ya que el valor es una referencia o un valor primitivo
2

pensé Java es asignado por valor, no hacen referencia a ?

¿Qué significa "assigned by value"? ¿Estás confundiéndolo con "pasar por valor/referencia"?

En cualquier caso, si maneja una instancia de clase en Java, en realidad está manejando una referencia a esa clase (muy parecido a un puntero en C/C++). Su tarea solo copia la referencia, por lo que tanto A como B se refieren a la misma instancia, es decir, los datos se comparten, de ahí el resultado.

1

A es una referencia al objeto. Por lo tanto, si cambia el estado interno del objeto , se reflejará en todas las demás variables que lo señalen.

Si vuelve a asignar A, a continuación, B no va a cambiar:

Foo a = new Foo(); 
Foo b = a; 
a.bar = "bar"; // this is reflected in b 
a = new Foo(); // b stays pointing to the previous Foo 
a.bar = "baaar"; // b stays with a value of bar="bar" 

(.. Java es pase por valor de comprobación this article al respecto)

+0

Java es estrictamente pasar por valor. Al pasar una referencia por valor, solo la referencia se duplica, no el objeto al que se hace referencia. –

+0

@Maven, por supuesto, un error estúpido, pensé en uno y escribí el otro :) gracias – Bozho

0

En Java, las variables pueden ser dividido en dos categorías: Objetos y todo lo demás (int, long, byte, etc.).

Un tipo primitivo (int, largo, etc.) tiene el valor que usted le asigne. Una variable de objeto, por el contrario, contiene una referencia a un objeto en alguna parte. Entonces, si asigna una variable de objeto a otra, ha copiado la referencia, ambos puntos A y B apuntan al mismo objeto.

NOTA: Las cadenas en Java son en realidad objetos, no primitivos, que los principiantes a menudo asumen.

Espero que esto ayude

Cuestiones relacionadas