Está usted en Indice > Construcción > Lenguajes > Java > Lecciones y Paso a Paso > Consejos Técnicos de la Conexión del Desarrollador Java
Construcción
Maletín
Utilidades
Cursos
Promoción
Rentabilidad
Zona Novatos
Foros
Acceso a tu cuenta

Consejos Técnicos de la Conexión del Desarrollador Java

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:

  • Cómo se pasan los Argumentos a un Método Java.
  • Convertir Programas escritos en C a Lenguaje Java.

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 Java

Supongamos 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


Versión imprimible - Versión imprimible de este documento
Enviar e-mail - Enviar por e-mail este documento
Publicidad

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.


Página generada el 02-12-2008 a las 05:34:04