2012-05-25 19 views
9
public class program1{ 

    public static void main(String args[]){ 

     java.util.Vector vc=new java.util.Vector(); 

     vc.add("111"); 
     vc.add("222"); 

     functioncall(vc); 

     vc.add("333"); 

     System.out.println(vc); 

    } 

    public static void functioncall(java.util.Vector vc){  

     vc=null;  

    } 
} 

La salida del programa anterior es [111,222,333]. pero, cuando ejecuto el siguiente programa, la salida es [333]. ¿Confundido cuando pasamos una referencia, cómo funciona si es llamada por valor o llamada por referencia? y por quéConfundido, si Java usa la llamada por valor o llama por referencia cuando se pasa una referencia de objeto?

public class program1{ 

    public static void main(String args[]){ 

     java.util.Vector vc=new java.util.Vector(); 

     vc.add("111"); 
     vc.add("222"); 

     functioncall(vc); 

     vc.add("333"); 

     System.out.println(vc); 

    } 

    public static void functioncall(java.util.Vector vc){ 

     vc.removeAllElements(); 

    } 
} 
+2

¿por qué voto negativo? no entiendo ... – user617597

+0

Estuve tentado a votar por ese "desayuno de perros" de sangría con código, pero lo dejé pasar. Sospecho ** que fue rechazado por alguien que siente que hay muchos duplicados. Compruebe los hilos 'Relacionados' que se muestran en la columna de la derecha para obtener mejores resultados ahora que se han agregado las etiquetas [etiqueta: pase por referencia] y [etiqueta: pase por valor]. –

+2

Porque ya se le ha preguntado un millón de veces, lo que un motor de búsqueda mostraría rápidamente. Ahora habrá debates interminables nuevamente, porque la mayoría de la gente está equivocadamente convencida de que es llamada por referencia. Si fuera llamada por referencia, entonces su primer ejemplo arrojaría NullPointerException. –

Respuesta

19

Pasa el valor de la referencia.

Para descaradamente robar una analogía que vi publicada hace un tiempo, imagina que cada identificador que usas es un pedazo de papel con una dirección escrita en él. La dirección apunta a una casa.

Puede cambiar la casa (por ejemplo, agregando objetos al vector o despejándolo), pero aún está sosteniendo la misma hoja de papel, y la dirección todavía lo lleva a la misma casa.

Si configura el vector en nulo, todo lo que hace es borrar la dirección.

This article lo explica con mucho más detalle.

2

Java usa las referencias de Objeto. El argumento es un valor de referencia. Así que es llamada por valor, donde el valor es una referencia para los objetos.

1

vc es una nueva variable que contiene la referencia del vector que se utilizó para llamar al método. Cambiarlo a nulo no afecta al vector original porque esta referencia es una copia de la referencia vectorial original.

Pero dado que esto es una referencia al vector original, cualquier modificación del vector realmente cambia el vector original. Entonces Java siempre usa la llamada por valor, aquí el valor pasa a ser una referencia.

2

Pasa vc como copia de referencia (siempre). Luego haciendo vc = null; o vc = new Vector(), solo modifica la referencia desde el atributo local vc y por lo tanto es normal que la principal no haya cambiado.

0

Con Java "pase por referencia", la referencia se pasa por valor.

Por lo tanto, no puede cambiar la referencia en sí, pero puede cambiar el objeto al que apunta la referencia.

Por lo tanto, su llamada removeAll actúa en el Vector para que vea los resultados. Sin embargo, si se cambia la referencia de sí mismo como:

vc = null 

o,

vc = new Vector(); 

Estos cambios apuntan a un nuevo (o nula) de objetos, por lo que cualquier cambio después de que no se reflejan en el objeto de main

+0

"Como de costumbre con cualquier pase por referencia ..." Eso no es lo que significa "pasar por referencia" en absoluto. Eso es paso por valor. En verdadero paso por referencia, p. en C++, puede pasar una variable a la función, y la función puede asignar a esa variable * como si * se le asignó en el alcance de la llamada. Eso es "como siempre" con pasar por referencia, y no es posible en Java. – user102008

+0

@ user102008 Ok ... Lo edité. Tienes razón ... mi respuesta sonó como si estuviera hablando de todos los idiomas. – Chip

2

Se llama por valor. En ambos casos, ponga valor de referencia a referencia en el argumento del método que es local referencia del método.

0

Java funciona con el concepto "Call by Value".Si su pila y montón se visualizan, entonces java intenta encontrar los valores de cualquier variable en el espacio de trabajo local, si no se encuentra en local, entonces intenta averiguar en el objeto que está en el montón.

Ejemplo

class Foo 
{ 

int x; 

public void call(int x) 

{ 

    x++; 

} 

public static void main(String[] args) 

{ 

     Foo foo = new Foo(); 

     foo.x = 5; 

     System.out.println(foo.x); 

     foo.call(foo.x); 

     System.out.println(foo.x); 


} 


} 

de salida de programa anterior sería: 5, 5 Descipción: En el método principal, el valor de x se asigna 5 en la referencia de "foo: En el método de llamada, hay es una variable local llamada "x" (pasada como argumento) en el espacio de trabajo. por lo que su valor se cambiará solo en su área de trabajo cuando el control de esta función regrese al método principal. En el área de trabajo principal, el valor de "x" sigue siendo 5.

Ejemplo

class Foo 

{ 

int x; 

public void call(int y) 

{ 

    x++; 

} 

public static void main(String[] args) 

{ 

     Foo foo = new Foo(); 

     foo.x = 5; 

     System.out.println(foo.x); 

     foo.call(foo.x); 

     System.out.println(foo.x); 

} 


} 

de salida de programa anterior sería: 5, 6

Desciption: En el método principal, el valor de x se asigna 5 en la referencia de "foo: En el método de llamada , no hay una variable local llamada "x" (pasada como argumento) en el espacio de trabajo. Entonces java lo encuentra en referencia a través del cual se llamó a la función "call" y el valor de "x" está allí 5, call method incrementa su valor a "6" por lo que su valor sería referencia cambiada, es decir, "foo". cuando el control de esta función vuelve al método principal. Ahora, en el valor del espacio de trabajo de main de "x" es 6 porque aquí imprimimos "x" en la referencia foo.

Espero que esto lo ayude a aclarar sus conceptos.

Saludos, Sushil Jain

1

lenguaje de programación Java siempre utiliza la llamada por valor. En Java, todos los parámetros de los métodos se llaman por valor o pasan por valor. Cayo S. Horstmann y Garry Cornell han mencionado en su muy famoso libro "Core Java Volume - I Fundamentals" que el lenguaje de programación Java siempre usa la llamada por valor. Esto significa que el método obtiene una copia de todos los valores de parámetros, y el método no puede modificar el contenido de las variables de parámetros que se le pasan. Java utiliza dos tipos de parámetros del método:

  • tipos primitivos de Java
  • objeto Java hace referencia a

Parece muy sencillo y simple cuando experimente pasando tipos primitivos a un método, pero se oscurece cuando se viene a pasar objetos a un método. Curiosamente, cuando se pasa una referencia de objeto a un método, el método obtiene una copia de la referencia de objeto, y tanto la copia original como la formal se refieren al mismo objeto, por lo tanto dentro del método se puede cambiar el estado de un parámetro de objeto .

El siguiente artículo explica bien Call by value and call by reference.

0

Pass-por-valor

El parámetro real (o expresión argumento) está completamente evaluado y el valor resultante se copia en una ubicación que se utiliza para mantener el valor del parámetro formal durante la ejecución del método/función. Esa ubicación suele ser un trozo de memoria en la pila de ejecución para la aplicación (que es cómo lo maneja Java), pero otros lenguajes podrían elegir el almacenamiento de parámetros de manera diferente.

Pase por referencia El parámetro formal simplemente actúa como un alias para el parámetro real. Cada vez que el método/función usa el parámetro formal (para leer o escribir), en realidad está usando el parámetro real. Java es estrictamente el paso por valor

1

Java y C es siempre llamada por valor. El término llamada por referencia se aplica estrictamente a C++ donde usamos el operador & en el argumento formal. En el caso de referencias a objetos, las referencias se copian del argumento real al argumento formal.

1

Pasar por valor en java significa pasar una copia del valor que se va a pasar. Pasar por referencia en java significa pasar la dirección en sí. En Java, los argumentos siempre pasan por valor. Java solo admite pasar por valor.

Con los objetos Java, la referencia del objeto en sí se pasa por valor y, por lo tanto, tanto la referencia original como la copia del parámetro se refieren al mismo objeto Java. Las primitivas Java también pasan por valor.

Cuestiones relacionadas