Pasar y devolver objetos a métodos en Java

Intermedio POO

Cuando pasamos un tipo primitivo a un método, se pasa por valor. Pero cuando pasamos un objeto a un método, la situación cambia drásticamente, porque los objetos se pasan por lo que efectivamente es llamado, por referencia. Java hace esta cosa interesante que es una especie de híbrido entre pasar por valor y pasar por referencia. Básicamente, la función no puede cambiar un parámetro, pero la función puede pedirle al parámetro que se cambie a sí mismo llamando a algún método dentro de él.

  • Al crear una variable de un tipo de clase, solo creamos una referencia a un objeto. Por lo tanto, cuando pasemos esta referencia a un método, el parámetro que lo recibe se referirá al mismo objeto que el referido por el argumento.
  • Esto significa efectivamente que los objetos actúan como si se pasaran a los métodos mediante el uso de llamada por referencia.
  • Los cambios en el objeto dentro del método se reflejan en el objeto utilizado como argumento.

1. Pasar objetos a métodos

En Java podemos pasar objetos a métodos. Por ejemplo, considere el siguiente programa:

// Programa Java para demostrar el paso de objetos a métodos.

class Demo {
    int a, b;

    Demo(int i, int j) {
        a = i;
        b = j;
    }

    // devuelve true si los valores
    // para las referencias son los mismos
    boolean equalTo(Demo obj) {
        return (obj.a == a && obj.b == b);
    }
}
    public class Test {
        public static void main(String args[]) {
            Demo ob1 = new Demo(100, 22);
            Demo ob2 = new Demo(100, 22);
            Demo ob3 = new Demo(-1, -1);

            System.out.println("ob1 == ob2: " + ob1.equalTo(ob2));
            System.out.println("ob1 == ob3: " + ob1.equalTo(ob3));
        }
    }

Salida:

ob1 == ob2: true
ob1 == ob3: false

1.1. Explicación con imágenes

  • Se crean tres objetos ‘ob1’, ‘ob2’ y ‘ob3’:
Demo ob1 = new Demo(100, 22);
Demo ob2 = new Demo(100, 22);
Demo ob3 = new Demo(-1, -1);

Creación de Objetos

  • Desde el lado del método, se declara una referencia de tipo Demo con un nombre obj y se asigna inicialmente nulo.

referencia de tipo Foo

  • Como llamamos al método equalTo, la referencia ‘obj’ se asignará al objeto que se pasa como un argumento, es decir, ‘obj’ se referirá a ‘ob2’ cuando la siguiente sentencia se ejecute.
System.out.println("ob1 == ob2: " + ob1.equalTo(ob2));

método equalTo

  • Ahora, como podemos ver, se llama al método equalTo sobre ‘ob1’, y ‘obj’ se refiere a ‘ob2’. Dado que los valores de ‘a’ y ‘b’ son los mismos para ambas referencias, entonces si (condición) es verdadero, entonces boolean retornará true.
if(obj.a == a && obj.b == b)
  • De nuevo ‘obj’ se reasignará a ‘ob3’ a medida que se ejecuta la siguiente instrucción.
System.out.println("ob1 == ob3: " + ob1.equalTo(ob3));

Pasar objetos a métodos

  • Ahora, como podemos ver, el método equalTo se llama en ‘ob1’, y ‘obj’ se refiere a ‘ob3’. Como los valores de ‘a’ y ‘b’ no son los mismos para ambas referencias, entonces si (condición) es falso, entonces el bloque se ejecutará y se devolverá false.

2. Definir un constructor que toma un objeto de su clase como un parámetro

Uno de los usos más comunes de los parámetros de objeto implica constructores. Con frecuencia, en la práctica, hay necesidad de construir un nuevo objeto para que inicialmente sea el mismo que un objeto existente. Para hacer esto, o podemos usar el método Object.clone() o definir un constructor que tome un objeto de su clase como un parámetro. La segunda opción se ilustra en el siguiente ejemplo:

// Programa Java para utilizar un objeto para inicializar otro

class Caja {
    double ancho, alto, largo;

    //Observe este constructor.
    //Toma un objeto de tipo Caja.
    //Este constructor usa un objeto para inicializar otro.

    Caja(Caja ob)
    {
        ancho = ob.ancho;
        alto = ob.alto;
        largo = ob.largo;
    }

    //constructor utilizado cuando todas
    //las dimensiones están especificadas
    
    Caja (double w, double h, double d)
    {
        ancho = w;
        alto = h;
        largo = d;
    }

    double volumen()
    {
        return ancho * alto * largo;
    }
}
    public class Test {
        public static void main(String args[]) {
            Caja miCaja = new Caja(10, 20, 15);

            // creando una copia de miCaja
            Caja miclon = new Caja(miCaja);

            double vol;

            // obtener volumen de miCaja
            vol = miCaja.volumen();
            System.out.println("Volumen de mi Caja es " + vol);

            // obtener volumen de miclon
            vol = miclon.volumen();
            System.out.println("Volumen de mi miclon es " + vol);
        }
    }

Salida:

Volumen de mi Caja es 3000.0
Volumen de mi miclon es 3000.0

3. Devolución de objetos

En Java, un método puede devolver cualquier tipo de datos, incluidos los objetos. Por ejemplo, en el siguiente programa, el método incrByTen() devuelve un objeto en el que el valor de a (una variable entera) es diez mayor que en el objeto invocado.

// Programa Java para demostrar la devolución de objetos

class DemoRetornarObjeto {
    int a;

    DemoRetornarObjeto(int i)
    {
        a = i;
    }

    // Este método devuelve un objeto
    DemoRetornarObjeto incrByTen(){
        DemoRetornarObjeto temp = new DemoRetornarObjeto(a+10);
        return temp;
    }
}
    public class Test {
        public static void main(String args[]) {
            DemoRetornarObjeto ob1 = new DemoRetornarObjeto(2);
            DemoRetornarObjeto ob2;

            ob2 = ob1.incrByTen();

            System.out.println("ob1.a: " + ob1.a);
            System.out.println("ob2.a: " + ob2.a);
        }
    }

Salida:

ob1.a: 2
ob2.a: 12

Nota: Cuando se pasa una referencia de objeto a un método, la referencia misma se pasa mediante el uso de llamada por valor. Sin embargo, dado que el valor que se pasa se refiere a un objeto, la copia de ese valor seguirá haciendo referencia al mismo objeto que hace su argumento correspondiente.

Hasta este punto, los ejemplos han estado usando tipos simples como parámetros para los métodos. Sin embargo, es correcto y común pasar objetos a los métodos.

Métodos en Java
  • Pasar y devolver objetos a métodos

Sobre el Autor:

Hey hola! Yo soy Alex Walton y tengo el placer de compartir conocimientos hacía ti sobre el tema de Programación en Java, desde cero, Online y Gratis.

Deja una Respuesta

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.