2010-05-05 11 views
10

En una clase, que tengo:¿Cómo se puede hacer la asignación de Java para apuntar a un objeto en lugar de hacer una copia?

private Foo bar; 
public Constructor(Foo bar) 
{ 
    this.bar = bar; 
} 

En lugar de crear una copia de la barra desde el objeto proporcionada en el parámetro, es posible incluir un puntero a la barra en el constructor de tal manera que el cambio de los cambios de barras originales el campo en este objeto?

Otra manera de decirlo:

int x = 7; 
int y = x; 
x = 9; 
System.out.print(y); //Prints 7. 

Es posible configurarlo de modo que la impresión impresiones 9 Y en lugar de 7?

Respuesta

8

Su último ejemplo funciona de esta manera porque int es una primitiva, se copia por valor. En el primer ejemplo, "this.bar" contendría una copia de la referencia (tipo de puntero) a bar. Entonces, si cambias la barra original (internamente), el cambio se reflejará en tu clase. Intentalo.

+1

"int es un primitivo, se copia por el valor" puede ser ligeramente confuso. Las referencias también se copian por valor. – aioobe

+2

Sí. Pero el cartel estaba pensando en términos de objetos. Es importante comprender, para empezar, que los objetos (contrariamente a C++) NUNCA se copian por valor. – leonbloy

16

Cuando se usa una variable como argumento para un método, su contenido es siempre copiado. (Java tiene solocall-by-value). Lo que es importante entender aquí, es que puede solo referirse a objetos a través de referencias. Entonces, lo que realmente ocurre cuando pasas una variable que hace referencia a un objeto, es que pasas la referencia al objeto (¡por valor!).

Alguien puede decirle "las primitivas se pasan por valor" y "las no primitivas se pasan por referencia", pero eso es simplemente porque una variable nunca puede contener un objeto, solo una referencia a un objeto. Cuando alguien lo entienda, estará de acuerdo en que incluso las variables que se refieren a los objetos pasan por valor.

De Is Java "pass-by-reference" or "pass-by-value"?

Java es siempre el paso por valor. Lo difícil puede ser entender que Java pasa objetos como referencias pasadas por valor.

De http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Java hace manipular objetos por referencia, y todas las variables de objeto aparecen referencias. Sin embargo, Java no pasa argumentos de método por referencia; los pasa por valor

En Java, no hay contrapartida al "tipo de referencia" de C++ para las primitivas.

+1

La primera oración es correcta, pero podría ser engañosa para muchas personas que vienen a Java pensando que una "variable es un objeto" (cuando en realidad una variable es una referencia a un objeto -o una primitiva). Lo que un principiante debe comprender primero es que el objeto en sí nunca se copia cuando se pasa como argumento. – leonbloy

1

Java nunca copia objetos. Es más fácil pensar en términos de cada "nuevo" que tendrá una instancia de objeto, nunca más.

La gente se pone REALMENTE CONFUSO cuando hablan de esto en términos de pase por referencia/pase por valor, si no está sorprendentemente familiarizado con lo que significan estos términos, sugiero que los ignore y recuerde que Java nunca copia objetos.

Por lo tanto, java funciona exactamente como usted quería que fuera su primer ejemplo, y esta es una parte fundamental de OO Design: el hecho de que una vez que crea una instancia de un objeto, es el mismo para todos los que lo utilizan.

El tratamiento de primitivas y referencias es un poco diferente, ya que no son objetos, siempre se copian, pero el efecto neto es que java está haciendo siempre lo que usted desea sin sintaxis adicional o confuso opciones.

3

Para conseguir que el comportamiento podría modificar un miembro de un objeto:

public class Number{ 
    int value; 
    Number(int value){ 
    this.value = value; 
    } 
    public String toString() { 
    return "" + value; 
    } 
} 

A continuación, podría hacer:

Number x = new Number(7); 
Number y = x; 
x.value = 9; 
System.out.println(y);//prints 9 
Cuestiones relacionadas