Pildoritas de POO y Java: Introducción a la Orientación a Objetos

Como veíamos en la pildorita introductoria, la evolución de los lenguajes de la programación siempre ha seguido una meta clara: encontrar la metodología más intuitiva para los seres humanos. Para ello, la programación siempre intenta alcanzar el mayor grado de abstracción, modularidad y encapsulación. La Programación Orientada a Objetos no es más que el enésimo y último (o penúltimo si contemplamos la programación orientada a aspectos) intento de alcanzar esas metas, utilizando para ello dos conceptos muy claros: Clases y Objetos.

El mundo real está repleto de Objetos. Algunos son tangibles, como una persona, una mesa o un coche y otros intangibles, como un crédito, una raíz cuadrada o la ventana de una aplicación. Los seres humanos somos criaturas muy observadoras que tendemos además a clasificar esos objetos en diferentes tipos (o Clases) por medio del proceso de abstracción, por el cual se identifican las características esenciales comunes de un conjunto de objetos, prescindiendo de los detalles superfluos.

Por ejemplo, por medio de la observación de otros animales y nosotros mismos, hemos identificado que un conjunto de los mismos somos vertebrados, de sangre caliente, tenemos glándulas mamarias y somos vivíparos (con la excepción del ornitorrinco xD) y los hemos clasificado como Mamíferos.

Un capítulo de biología sobre los Mamíferos nos explica las partes que lo componen, las funciones que realizan, etc., eso es una Clase. Por otra parte tú, o mis gatetes, son objetos de esta clase. Los objetos son entidades concretas que siguen la descripción de dicha Clase.

mamiferosObjetos de la clase Mamífero

En el desarrollo POO se definirá antes de nada la clase y una vez hecho esto, crearemos objetos de esa clase y trabajaremos con ellos. Poniéndonos filosóficos y egocéntricos, los programadores de POO son algo así como Demiurgos, encargados de describir ideas que sirven de molde para los objetos que luego compondrán el mundo real.

Por otra parte, como la POO es imperativa al fin y al cabo, todo se entiende a partir de variables que cambian sus estados durante el transcurso de la ejecución. Para ello, los objetos se compone de atributos, variables que almacenan diferentes estados, y métodos, funciones que realizan diferentes acciones sobre los estados de los atributos.

Hay que tener en cuenta que los atributos también serán objetos (los tipos primitivos no dejan de ser clases también) que componen ese supra-clase. La interacción de estos diferentes objetos entre sí, a partir de lo que se llama mensajes, y las relaciones que existen entre ellos, son precisamente las causantes de que esta programación imperativa marque la diferencia.

Por otra parte, las clases también tienen un ámbito privado y otro público, para conseguir las tan preciadas metas de la encapsulación y abstracción. Tanto las clases, como variables, constantes o métodos, pueden tener un ámbito privado o público, dependiendo si interactuarán con otras clases o son sólo de carácter interno. En el caso de Java también existe otro ámbito, el protected, pero por ahora no vamos a entrar en él.

Veamos ahora un ejemplo muy sencillo de definición de una clase y uso de la misma, para que podáis asimilar las ideas expuestas hasta ahora.

Aunque es un ejemplo muy básico pondré un Diagrama de Clases para que se vea mejor. El UML es un lenguaje de diseño que en sí mismo daría para una serie de Pildoritas nuevas (que espero algún día hacer xD). Cada símbolo tiene significados muy concretos y diferencias con otros que, aunque visualmente no sean muy notables, suelen ser muy importantes a la hora de plasmar nuestro código. También es cierto que se puede llegar a entender en líneas generales el problema sin tener ni idea de UML, que es lo que pretendo en este caso 🙂

f3aec65a

Vamos a definir una clase Persona. Los atributos están al comienzo de la “tabla” Persona y separados por una línea, los métodos. Los símbolos + y – indican su ámbito (público o privado). Por último, tendremos una clase PruebaPersona que simplemente tiene un método main y utiliza una clase Persona.

Para el desarrollo del diagrama, por cierto, he utilizado una herramienta online que no conocía pero me ha enamorado, yuml.me. Genera vía online diagramas de clases, casos de uso y diagramas de actividad. Simplemente hay que definir el diagrama con una sintáxis que se explica muy bien en los ejemplos y te genera directamente una URL de edición, imágenes png, jpg, archivos pdf y json…Vamos, una pasada. Os lo recomiendo.

 package ejemplo1.persona;
/**
 * Clase Persona
 * @version 1.0
 * @since 2014
 */
public class Persona {

	private String nombre;
	private String apellidos;
	private String dni;
	private Integer edad;
	private String sexo;
	
	public String codigoUnico;

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellidos() {
		return apellidos;
	}

	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}

	public String getDni() {
		return dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	public Integer getEdad() {
		return edad;
	}

	public void setEdad(Integer edad) {
		this.edad = edad;
	}

	public String getSexo() {
		return sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}
	
	public String toString() {
		String nuevalinea = System.getProperty("line.separator");
		String resultado = "DATOS DE LA PERSONA: " + nuevalinea + 
				"Codigo Unico: " + this.codigoUnico + nuevalinea +
				"Nombre: " + this.getNombre() + nuevalinea + 
				"Apellidos: " + this.getApellidos() + nuevalinea + 
				"DNI: " + this.getDni() + nuevalinea +
				"Edad: " + this.getEdad() + nuevalinea +
				"Sexo: " + this.getSexo() + nuevalinea;

		return resultado;
	}
}

Como veis, la clase persona está compuesta por los atributos que le describen, en este caso nombre, apellidos, dni, edad, sexo y codigoUnico. Además, se han creado una serie de métodos para poder obtener los valores de los atributos privados (métodos get) y cambiarlos (métodos set), así como un método toString que devuelve es una representación en formato String de la clase.

Todos los atributos menos codigoUnico son privados, por lo que no se puede acceder directamente desde otra clase a los mismos si no es a través de los métodos públicos get y set creados para este fin. Por su parte el atributo codigoUnico se puede modificar y obtener directamente desde otras clases, como se puede ver en la clase de Prueba de a continuación, ya que está en la vista pública de la clase.

La palabra reservada this, por su parte, lo que hace es indicar que se hace referencia a atributos o métodos del objeto. Existen otras palabras reservas como super, que ya veremos más adelante para que sirven.

package ejemplo1.persona
/**
 * Clase Test para probar la clase Persona
 * @version 1.0
 * @since 2014
 */
public class PruebaPersona {

	public static void main(String[] args) {
		
		Persona mar = new Persona();
		
		mar.codigoUnico = "112";
		
		mar.setNombre("Mar");
		mar.setApellidos("Millan");
		mar.setEdad(27);
		mar.setSexo("F");
		mar.setDni("01168899Q");
		
		
		System.out.println(mar.toString());
		
	}
}

SALIDA DE LA CLASE PruebaPersona:

DATOS DE LA PERSONA:
 Codigo Unico: 112
 Nombre: Mar
 Apellidos: Millan
 DNI: 01168899Q
 Edad: 27
 Sexo: F

Como podéis ver para crear un objeto se utiliza la siguiente sentencia: Persona mar = new Persona(). Esto se llama constructor y lo que hace es crear en memoria una instancia, es decir, un objeto, del tipo Persona. No entraremos en que es un constructor y lo veremos en la siguiente pildorita, pero por ahora basta saber que todas las clases tienen uno sin parámetros, como el utilizado en este ejemplo, encargados de crear objetos concretos en memoría de la clase a la que pertenecen.

El atributo codigoUnico le hemos dado un valor refiriendonos directamente a él, lo cual se hace indicando el nombre del objeto de la clase que hemos creado seguido del atributo o método separado por un punto.

El resto de parametros al ser privados, sólo se pueden setear a través de los métodos creados con tal fin. Como se ve para este fin utilizamos sus métodos set, pasándoles por parámetro los valores que queremos que tomen estas variables.

Por último, podemos ver una sentencia System.out.println al que le pasamos el string que genera el método toString(), que muestra por pantalla dicha cadena.

Espero que esta Pildorita os haya dado una visión general de la Programación Orientada a Objetos. En las próximas pildoritas empezaremos a meternos con mayor profundidad en los diferentes conceptos que hoy hemos tocado de pasada.

Índice de Pildoritas

Share