Vamos a acercarnos a partir de este artículo a los conceptos básicos de la POO (Programación Orientada a Objetos). No vamos a dejar de revisar conceptos previos pero dado que en los últimos artículos hemos estado hablando de tipos de variables, es procedente que revisemos el concepto de objeto y su significado dentro de un programa, ya que los objetos no son “variables” como la mayoría cree cuando empieza en este tipo de programación…
Lo primero que debemos tener en cuenta es lo siguiente: los objetos no son variables. Se suele confundir el concepto de objeto con variable porque habitualmente se suele decir “nombre es un objeto de tipo String”, aunque esta forma de hablar es incorrecta, como veremos a continuación. Las variables de objeto son como cualquier otra variable, sólo que en vez de ser números o punteros, son objetos. El objeto, pues, es un valor de un tipo concreto (que es lo que llamamos una “clase”), pero es un valor que no podemos usar directamente como hacemos con una variable estándar nativa, como un número entero o un char, ya que será una composición de datos, no un dato único como en los otros casos.
# Objeto - Instancia
Cuando creamos un objeto (usando comunmente en la mayoría de los lenguajes la palabra new, aunque en algunos como Python los objetos se generan directamente desde la clase), dicho objeto no es otra cosa que un bloque de datos en memoria que contiene los atributos del objeto. Es decir, que se trata de un conjunto de bytes que empieza en un punto determinado y tiene una determinada longitud. Si una clase tiene atributos con una longitud de 32 bytes, ese bloque de 32 bytes constituye el objeto como tal. Bien, a esto es a lo que llamamos instancia del objeto (es decir, el objeto sería la forma abstracta de la instancia, que denominaría el bloque de memoria como tal). La instancia de la clase es un bloque de un tipo concreto que, como acabo de mencionar, comienza en una dirección de memoria concreta, a la que se denomina referencia del objeto, y que es el valor que realmente se asigna a la variable del programa:
String nombre = new String();
La palabra new es fundamental. Su funcionamiento se resume en lo siguiente:
Primero averiguamos qué longitud tiene la clase de la que queremos generar el objeto (la instancia).
Llama a malloc() para reservar la memoria con la longitud del paso anterior.
Llama al constructor de la clase que hemos indicado para inicializar el objeto.
Devuelve la referencia de malloc() para que podamos asignárselo a la variable.
malloc() es una función de la librería estándar de C (que en última instancia va a ser quien va a generar memorias dinámicas en cualquier lenguaje de programación). A partir de que hemos creado la instancia, la referencia del objeto (o puntero para los que vienen de C/C++) se usará a través de la variable y podremos acceder a los miembros del objeto ya que ya tenemos la memoria reservada y allí es donde almacenaremos los datos.
# Referencias → Punteros
Las referencias creadas por new son realmente punteros a la memoria. En el artículo sobre arrays y punteros tenemos una idea general sobre como funcionan este tipo de variables:
Un puntero no es otra cosa que una dirección de memoria del ordenador. Un puntero es un número de 64 bits que se corresponde con una posible posición de memoria en la RAM del sistema informático. Obviamente, eso son muchos miles de millones de GB (más, de hecho) y por supuesto no vamos a ocupar esa cantidad de memoria, pero para manejar 8 GB de RAM, por ejemplo, necesitamos más de 32 bits de direcciones, sólo alcanzan para unos 4 mil millones de direcciones. Es decir, que un puntero van a ser direcciones que contienen hasta 8 bytes de datos en una variable. Lo mismo ocurre con las referencias: la referencia del objeto es un puntero que indica la dirección de memoria en la que se encuentra la instancia del objeto. Con esa referencia obtenemos la forma de acceder a los miembros del objeto: atributos y métodos.
# Objeto como estructura de datos
Se denomina estructura de datos a un conjunto de datos en el que cada dato se representa de forma atómica como una variable, con su tipo de dato. En C, una estructura sería algo así:
struct Persona {
char nombre[50];
char direccion[50];
char localidad[40];
int edad;
};
A partir de aquí puedo definir una variable de estructura y utilizar sus datos:
struct Persona miguel = {“miguel ruiz”, “calle pepe 1”, “villabajo del penedés”, 32};
printf(miguel.nombre);
Pues una clase es, en lo más básico, una estructura de datos que, además, contiene funciones llamadas métodos (que en C++ también existen en las estructuras porque en este lenguaje tanto estructuras como clases son lo mismo, así como en C#, que hereda este comportamiento):
class Persona {
String nombre;
String direccion;
String localidad;
int edad;
public void imprimir() {
System.out.println(nombre + “ - “ + direccion + “ - “ + localidad + “ - “ + edad);
}
}
Persona ana = new Persona(“ana ramírez”, “plaza españa 2”, “rueda”, 23);
ana.imprimir(); // imprime los datos del objeto
Sea la estructura o sea la clase, la forma de usar sus componentes (atributos y métodos) es básicamente la misma: creamos la variable del tipo que sea, lo inicializamos y usamos sus miembros en donde es necesario. La diferencia esencial es que una variable de estructura es un bloque de datos que se maneja como un valor en memoria. Lo importante aquí es comprender que un objeto es una estructura de datos que contiene métodos y que sus miembros los podemos usar para manejar su contenido de la forma que queramos.
# En resumen
Antes de ponernos a entender el manejo de objetos, cosa que haremos en próximos artículos, deberíamente entender que es un objeto, como se representa en memoria y como podemos entenderlo como concepto de programación. A partir de ahí, podemos realizar las operaciones necesarias y encapsular en ellos todos los funcionamientos que sean necesarios para el modelo (clase) que estamos usando para generar dichos objetos. En próximos artículos veremos más profundamente las clases, sus tipos y las múltiples posibilidades que nos permite la POO para crear grandes aplicaciones.

