Curso basico de Java - #11 - POO: Metodos construcores

Buenas,
Si bien lo que vimos en el anterior tema es fundamental para construir clases, en realidad no sabemos todavía como crear objetos a partir de esas clases.

Por eso en este tema veremos los métodos constructores, con los cuales nosotros podremos crear objetos de clases.

Quiero aclarar que las clases no tienen porque estar diseñadas para crear objetos de ellas, estas puedes ser usadas con fines organizativos o incluso como contenedores estáticos de información.


Métodos constructores
Esto es algo muy importante sobre el funcionamiento de las clases y objetos.
Ya sabemos que una clase alberga atributos y métodos, pero, también existe la posibilidad de crear métodos constructores. Es mediante estos métodos que podemos crear objetos de una clase, sin ellos nos limitamos a clases estáticas (veremos esto en el siguiente tema).

Los métodos constructores se usan para ejecutar un bloque de código a la hora de instanciar un objeto. Muchas veces reciben como parámetro los valores de varios atributos del objeto que se crea, ademas de ejecutar otros procesos.

Aunque nosotros como programadores no tengamos que poner ningún return los métodos constructores lo que hacen es devolver un objeto de la clase a la que pertenecen.

La sintaxis no es muy diferente a la de un método común, solo que siempre se declarara como public y el nombre del método tiene que ser el mismo que el de la clase:

Sintaxis de declaración
public [NombreDeLaClase]([parametro(s)])
{
    // Bloque de código.
}
Ejemplo básico
public class Manzana
{
    public Manzana()
    {
        // Bloque de código.
    }
}

Instanciar un objeto
Ya tenemos la base para definir una clase, ahora nos toca crear un objeto de esa clase.

Para eso llamaremos al método constructor de la clase, el cual devolverá un objeto de dicha clase.

new [NombreDeLaClase]([parametro(s)])

La palabra new es necesaria para instanciar (crear un nuevo objeto).

Esto como tal devuelve un objeto, pero ahora mismo no sabemos que hacer con el, por lo que en una gran cantidad de casos lo guardaremos en una variable de clase:

[NombreDeLaClase] [nombreVariable] = new [NombreDeLaClase]([parametro(s)]);

Por ejemplo:

Scanner entrada = new Scanner(System.in);
// o
Manzana merienda = new Manzana();

Clase funcional: ejemplo
Bien, creemos un par de clases de ejemplo; Manzana y AdministaManzanas.
La primera se encargara de definir un “molde” para que desde la segunda se puedan crear objetos de la primera clase.

Manzana.java
/**
 * Clase Manzana.
 * Contempla los estados que puede tener una manzana para poder crear objetos diferentes.
 * Tiene como atributos el peso (Kg), el color y si esta comida de una manzana
 */
public class Manzana
{
	/* Atributos */
	float   peso_kg;
	String  color;
	boolean estaComida;
	
	/**
	 * Constructor.
	 * Recibe el peso y el color de la manzana y se lo asigna a los atributos del objeto.
	 * Por defecto las manzanas están sin comer.
	 * @param p (float) Peso de la manzana en Kg.
	 * @param c (String) Color de la manzana. Ej: "Rojo".
	 */
	public Manzana(float p, String c)
	{
		peso_kg    = p;
		color      = c;
		estaComida = false;
	}
	
	/**
	 * Devuelve el valor actual de los atributos del objeto.
	 * @return (String) Cadena con el valor de todos los atributos.
	 */
	public String getAtributos()
	{
		String manzanaComida;  // Variable para guardar si la manzana ha sido comida o no en String.
		
		// Asignar el valor que le corresponde a manzanaComida dependiendo del valor booleano de estaComida.
		if (estaComida)
		{
			manzanaComida = "Si";
		}
		else
		{
			manzanaComida = "No";
		}
		
		// Devolver cadena con los atributos del objeto.
		return "Peso: " + peso_kg + "Kg. Color: " + color + ". ¿Esta comida?: " + manzanaComida + ".";
	}
	
	/**
	 * Simula la acción de comer la manzana, cambiara su estado a "comida" mediante la variable booleana estaComida.
	 */
	public void comer()
	{
		estaComida = true;
	}
}
AdministaManzanas.java
/**
 * Clase que se encargara de administrar la clase Manzana.
 */
public class AdministaManzanas
{
	public static void main(String[] args)
	{
		// Crear objeto mediante el constructor y guardarlo en la variable miManzana.
		Manzana miManzana = new Manzana(0.35F, "Verde");
		
		// Imprimir el resultado del metodo getAtributos() del objeto de la clase Manzana.
		System.out.println(miManzana.getAtributos());
		
		// Llamar al método comer del objeto guardado en miManzana.
		miManzana.comer();
		
		// Volver a imprimir los atributos para ver la diferencia.
		System.out.println(miManzana.getAtributos());

	}

}

Para ejecutar un programa que consista en mas de una clase (como este), debemos ejecutar el archivo que contenga el método main. En este caso AdministaManzanas.java.

Output
Peso: 0.35Kg. Color: Verde. ¿Esta comida?: No.
Peso: 0.35Kg. Color: Verde. ¿Esta comida?: Si.

Se que estos conceptos pueden ser complejos de digerir para los que no son programadores, ademas soy consciente de que mis explicaciones (no uso IA) pueden ser un poco toscas por llamarlo de alguna forma, así que animo a preguntar cualquier duda que le surja a cualquier persona que este leyendo esto.

En el siguiente tema veremos lo que son los elementos estáticos (static) y los modificadores de acceso (public, private, protected, …) los cuales sirven para garantizar la adecuada encapsulación de los datos y funciones de un código.

2 Me gusta