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 (2)

Luego se llama al método f usando la instrucción invokestatic. El valor del argumento es extraído de la pila, y se usa para crear un marco de pila para el método llamado. Este marco de pila representa las variables locales en f, con el parámetro del método (arg1) siendo la primera de las variables locales.

Lo que esto significa es que los parámetros de un método son copias de los valores de los argumentos pasados al método. Si modificamos un parámetro, no tiene efecto en el llamador. Simplemente cambiamos el valor de la copia en el marco de pila que se está usando para contener las variables locales. No hay forma de "obtener de vuelta" los argumentos en el método llamante. Por eso asignar arg1 en f no cambia el valor de arg1 en el método main. Las variables arg1 en f y en main no están relacionadas, excepto en que el arg1 de f empieza con un copia del valor del arg1 de main. La variables ocupan diferentes posiciones de memoria, y el hecho de que tengan el mismo nombre es irrelavante.

Por contraste, un parámetro pasado por referencia se implementa pasando la dirección de memoria del argumento del llamador a la función llamada. La dirección del argumento es copiada dentro del parámetro. El parámetro contiene una dirección que referencia la posición de memoria del argumento para que los cambios en el parámetro realmente cambie en el valor del argumento en el llamador. En términos de bajo nivel, si tenemos la dirección de memoria de una variable, podemos cambiar el valor de la variable.

El discusión del paso de argumentos es complicada por el hecho de que el término "referencia" en paso por referencia significa algo ligeramente diferente al uso típico en términos de programación Java. En Java, el término referencia se usa en el contexto de objetos referencia. Cuando pasamos un objeto referencia a un método, no estámos usando el paso por referencia sino el paso por valor. En particular, se hace una copia del valor del objeto referencia, y cambiar la copia (a través del parámetro) no tiene efecto en el llamador. Echemos un vistazo a un par de ejemplos para clarificar esta idea:

    class A {
        public int x;
    
        A(int x) {
            this.x = x;
        }
    
        public String toString() {
            return Integer.toString(x);
        }
    }
    
    public class CallDemo2 {
        static void f(A arg1) {
            arg1 = null;
        }
    
        public static void main(String args[]) {
            A arg1 = new A(5);
    
            f(arg1);
    
            System.out.println("arg1 = " + arg1);
        }
    }
  

En este ejemplo, una referencia a un objeto A es pasada a f. Seleccionar arg1 a null no tiene efecto en el llamador, igual que en el ejemplo anterior. Se imprime el valor 5. El llamador pasa una copia del valor del objeto referencia (arg1), no la dirección de memoria de arg1. Por eso el método llamado no puede devolver arg1 y modificarlo.

Aquí hay otro ejemplo:

    class A {
        public int x;
    
        public A(int x) {
            this.x = x;
        }
    
        public String toString() {
            return Integer.toString(x);
        }
    }
    
    public class CallDemo3 {
        static void f(A arg1) {
            arg1.x = 10;
        }
    
        public static void main(String args[]) {
            A arg1 = new A(5);
    
            f(arg1);
    
            System.out.println("arg1 = " + arg1);
        }
    }
  

Aquí obtenemos el valor 10. ¿Cómo puede ser? Ya hemos visto que no hay forma de cambiar la versión del llamador de arg1 en el método llamado. Pero este código muestra que el objeto referenciado por arg1 se ha modificado. Aquí, el método llamante y el método llamado tienen un objeto en común, y ámbos métodos pueden modificar el objeto. En este ejemplo, el objeto referencia (arg1) es pasado por valor. Luego se hace una copia en el marco de la pila de f. Pero tanto el original como la copia son objetos referencia, y apuntan a un objeto común en memoria que puede ser modificado.

En programación Java, es común decir algo como "un objeto String se pasa al metodo f" o "un array se pasa al método g". Técnicamente hablando, los objetos y arrays no son pasados. En su lugar, se pasan sus referencias o sus direcciones. Por ejemplo, si tenemos un objeto Java que contiene 25 campos enteros, y cada campo tiene 4 bytes, el objeto será de aproximadamente 100 bytes de longitud. Pero cuando pasamos este objeto como un argumento a un métdo, no hay un copia real de los 100 bytes. En su lugar se pasa un puntero, referencia o dirección del objeto. El mismo objeto es referenciado en el llamante y en el método llamador. Por el contrario, en un lenguaje como C++, es posible pasar un objeto real o un puntero al objeto.



Usuarios que han visto este tema también han visto...

- Estructura general de un programa Java
- Utilerias Java
- Enviando emails con formato texto y HTML en Java
- Clonación de objetos en Java
- Aplicaciones a pantalla completa.


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






Cursos de Community Manager

Información legal | Política de Privacidad | Contacte con nosotros

Otro proyecto de Factoría de Internet. Copyright© 2003-2011 Factoría de Internet S.L.. Todos los derechos reservados.


Página generada el 25-05-2012 a las 20:48:45