Cuando comenzamos con la programación orientada a objetos (POO de ahora en adelante) en Java hay que entender algunos principios básicos que para algunas personas pueden ser confusos al iniciar, y quizá un poco más (o un alivio) si se viene de programar en C++ o algún lenguaje donde tengamos que manejar las referencias a los objetos a mano.

Una referencia en cualquier lenguaje de programación hace alución a la posición en memoria RAM que tiene dicha variable u objeto, al contrario de C++ en Java no nos tenemos que preocupar por manejar a mano los punteros hacia esas posiciones, ya que se encarga de manejarlas el mismo.

Tomemos como base la siguiente clase:

public class Person {
    
    private String name = "";
    private int age = 0;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public setAge(int age) {
        this.age = age;
    }

    public int setName(String name) {
        return this.name = name;
    }
    
}

Para crear una instancia de Person la llamamos con la siguiente línea:

Person person;

Esa línea crea una instancia de nuestro objeto Person, pero al no estar inicializado su referencia en memoria es null, para otorgarle un espacio en memoria hay que inicializar nuestro objeto:

Person person;
person = new Person("Marco", 25);

Al llamar a «new» estamos reservando en memoria el espacio necesario para todos los atributos de nuestro objeto, ahora la referencia ya no será null sino una dirección de memoria guardada en nuestra variable person invisible para nosotros y realmente no nos tendría que preocupar cual es esa dirección.

Podemos ver en la imagen de ejemplo que el objeto person ha tomado el valor en memoria de 0x00001 (no se lo crean literal, es solo a modo de ejemplo) la referencia en este caso podemos decir que es la flecha, y de la misma forma podemos crear todos los objetos que queramos del tipo Person, e irán tomando cada uno su propio espacio en memoria.

Tomemos ahora el ejemplo de crear otro objeto del mismo tipo y veamos su comportamiento en memoria:

Person person = new Person("Marco", 25);
Person person2 = new Person("Yesenia", 28);

Hagamos un pequeño experimento para entender un poco mejor como funciona la referencia de objetos, ahora hagamos que person2 sea igual a person, lo haremos de la siguiente manera y veamos que sucede:

Person person = new Person("Marco", 25);
Person person2 = new Person("Yesenia", 28);
person2 = person;

Viendo la imagen se puede distinguir que ahora person2 apunta al mismo espacio de memoria que person, entonces deducimos que lo que se copia en realidad entre las variables es la referencia en memoria y no el contenido del objeto, lo que quiere decir que ahora el espacio de memoria 0x0002 ha quedado sin ningún objeto que haga referencia a él, y queda marcado para ser eliminado por el garbage collector del que hablaré en otra ocasión.

Hagamos otro pequeño experimento, ahora tomemos nuestra primer variable person y creemos otro objeto con ella:

Person person = new Person("Marco", 25);
Person person2 = new Person("Yesenia", 28);
person2 = person;
person = new Peron("Jonathan", 25);

Yo creo que todos pueden intuir que es lo que sucede en la memoria

reasignando objeto

Podemos ver como ahora el objeto person apunta a otro espacio de memoria con sus correspondientes atributos, pero el primer espacio de memoria 0x00001 no ha sido marcado para eliminar, ya que aún contiene un objeto haciendo referencia al mismo, por lo que no se puede eliminar porque aún está en uso.

¿Recuerdan cuando dije que podían crear todos los objetos que quisieran? Bueno pues eso es una verdad a medias, y se explica en nuestro propio ejemplo de memoria, si vemos la última imagen, se muestra como están ocupados los únicos 3 espacios disponibles de memoria que tenemos, por lo que tratar de ocupar uno nuevo lanzaría un error, de ello va que los programas como juegos o software muy pesado tenga requerimientos mínimos de memoria ram por ejemplo.

De esta forma queda explicado a grandes razgos el como en la POO se manejan las referencias de objetos, específicamente en java. Aún hay más que explicar, pero eso será en otros posts.

Publicidad

[wp_ad_camp_1]