Presentación
Bienvenido a los Consejos Técnicos de la Conexión del Desarrollador Java (JDC), del 9 de Octubre de 2001. Esta edición cubre:
Estos consejos fueron desarrollados usando Java(tm) 2 SDK, Standard Edition v 1.3
Se puede ver esta edición (en su original en inglés) de los Consejos Técnicos en formato html en http://java.sun.com/jdc/JDCTechTips/2001/tt1009.html
Cómo se pasan los Argumentos a los Métodos JavaSupongamos que estamos haciendo alguna programación en Java, y tenemos un sencillo programa como este:
public class CallDemo1 {
static void f(int arg1) {
arg1 = 10;
}
public static void main(String args[]) {
int arg1;
arg1 = 5;
f(arg1);
System.out.println("arg1 = " + arg1);
}
}
En el método main, a la variable arg1 se le ha dado el valor 5, y luego se ha pasado como argumento al método f. Este método declara un parámetro con el mismo nombre, arg1, usado para acceder al argumento.
¿Qué sucede cuando ejecutamos este sencillo programa? ¿El método f modifica el calor de arg1, qué valor se imprime, 5 ó 10? 5 es la respuesta correcta. Esto implica que seleccionar arg1 a 10 en el método f no tiene efecto fuera del método.
¿Por qué funciona de esta forma? La respuesta tiene que ver con las aproximaciones de paso por valor y paso por referencia para pasar argumentos a un método. El lenguaje Java usa exclusivamente paso por valor. Antes de explicar lo que esto significa, veamos un ejemplo de paso por referencia, usando código C++:
// CallDemo1.cpp
#include <iostream>
using namespace std;
void f(int arg1, int& arg2)
{
arg1 = 10;
arg2 = 10;
}
int main()
{
int arg1, arg2;
arg1 = 5;
arg2 = 5;
f(arg1, arg2);
cout << "arg1 = " << arg1 << " arg2 = "
<< arg2 << endl;
}
La función f tiene dos parámetros. El primero es un parámetro pasado por valor y el segundo por referencia. Cuando este programa se ejecute, la primera asignación en la función f no tiene efecto en el llamador (la función main). Pero la segunda asignación si, de hecho, cambia el valor de arg2 en main. El & de int& dice que arg2 es un parámetro pasado por referencia. Este ejemplo particular no tiene equivalencia en el lenguaje Java.
¿Entonces qué significa realmente el paso por valor? Para responder a esto, es instructivo ver algunos de los bytecodes de la JVM1 que resultan de los dos siquientes comandos:
javac CallDemo1.java
javap -c -classpath . CallDemo1
Aquí tenemos un extracto de la salida:
Method void f(int)
0 bipush 10
2 istore_0
3 return
Method void main(java.lang.String[])
0 iconst_5
1 istore_1
2 iload_1
3 invokestatic #2 <Method void f(int)>
En el método main, la instrucción iconst_5 empuja el valor 5 sobre la pila de operandos de la máquina virtual Java. Este valor es almacenado en la segunda variable local (arg1, con args como la primera variable local). iload_1 empuja el valor de la segunda variable local sobre la pila de operandos, donde será servida como argumento al método llamado.
Usuarios que han visto este tema también han visto...
- Creando un frame en Java
- Introducción al J2ME
- Java web frameworks - Cuál elegir?
- Crear sonido timbre de teléfono en Java
- Java y XML, JDOM
Información legal | Política de Privacidad | Contacte con nosotros
Otro proyecto de Factoría de Internet. Copyright© 2003-2008 Factoría de Internet S.L.. Todos los derechos reservados.