Paso por valor

chapter.gif (1105 bytes)home.gif (1054 bytes)next.gif (998 bytes)

Pasando datos a una función

Pasando datos de tipo básico

Pasando objetos


En el lenguaje C++ hay tres formas de pasar datos a una función: por valor, por dirección y por referencia.

En el lenguaje Java, solamente se pasa por valor, lo que significa que se efectúa una copia local de las entidades que se están pasando. Vamos a explicar mediante ejemplos, el significado de la expresión pasar por valor:

 

Pasando datos de tipo básico

disco.gif (1035 bytes)valor: ValorApp.java

Sea la función

    void funcion(int x){
        x=5;
        System.out.println("dentro de la función: a="+x);
    }

Sea la variable a que toma inicialmente el valor de 3. ¿Cuál será el valor de a después de la llamada a la función funcion?

        int a=3;
        funcion(a); 
     	System.out.println("después de la llamada: a="+a); 

En primer lugar, recordaremos que la función denominada funcion tiene un único parámetro x, cuyo alcance es desde la llave de apretura hasta la llave de cierre de la función. La variable x deja de existir una vez que la función retorna.

Vamos a ver en este ejemplo el significado de "paso por valor". La variable a toma el valor inicial de 3. Cuando se llama a la función se pasa el valor de a en su único argumento, el valor de a se copia en el parámetro x, la variable x toma el valor de 3. En el curso de la lamada a la función, el valor de x cambia a 5, pero cuando la función retorna, la variable x ha dejado de existir. La variable a no se ha modificado en el curso de la llamada a la función, y sigue valiendo 3.

Durante el curso de la llamada a la función funcion, existe la variable a y su copia x, pero son dos variables distintas, aunque inicialmente guarden el mismo valor.

public class ValorApp {
    public static void main(String[] args) {
        int a=3;
        System.out.println("antes de la llamada: a="+a);
        funcion(a);
        System.out.println("después de la llamada: a="+a);
    }

    public static void funcion(int x){
        x=5;
        System.out.println("dentro de la función: a="+x);
    }
}

 

Pasando objetos

disco.gif (1035 bytes)valor2: Entero.java, ValorApp2.java

Creamos una clase Entero muy sencilla que tiene como miembro dato un número entero valor, y un constructor que inicializa dicho miembro público al crearse un objeto de la clase Entero.

public class Entero {
    public int valor;
    public Entero(int valor){
        this.valor=valor;
    }
}

El valor devuelto por new al cear un objeto es una referencia a un objeto en memoria, que hemos denominado objeto. Creamos un objeto aInt de la clase Entero para guardar el número tres.

        Entero aInt=new Entero(3);
        funcion(aInt); 

El valor devuelto por new lo guardamos en aInt, y se lo pasamos a la función denominada funcion.

    void funcion(Entero xInt){
        xInt.valor=5;
    }

Dentro de la función denominada funcion disponemos en xInt de la referencia al objeto aInt. Como el argumento aInt y el parámetro xInt guardan la referencia al mismo objeto, es posible modificar dicho objeto en el curso de la llamada a la función, accediendo a sus miembros públicos. Desde xInt accedemos al miembro público valor para modificarlo. Cuando la función retorna, el objeto aInt habrá modificado su estado.

public class ValorApp2 {
    public static void main(String[] args) {
        Entero aInt=new Entero(3);
        System.out.println("Antes de llamar a la función");
        System.out.println("objeto.miembro "+aInt.valor);
        funcion(aInt);
        System.out.println("Después de llamar a la función");
        System.out.println("objeto.miembro "+aInt.valor);
    }

    public static void funcion(Entero xInt){
        xInt.valor=5;
    }
}

Estos dos ejemplos, nos ponen de manifiesto el significado de la frase "pasar por valor un dato a una función", y el distinto comportamiento de los tipos básicos de datos, que no se pueden modificar en el curso de la llamada a la función, de los objetos que si se pueden modificar. La referencia a un objeto se pasa por valor a la función. Dentro de la función, desde esta referencia podemos acceder a los miembros públicos de dicho objeto para modificar su estado.Cuando la función retorna el objeto estará modificado.