Java y las clases abstractas

¡Hola Mundo!

Inaugurando blog con una de las secciones que tengo claras que llenaré con lo que llamaré «Java 101». Esta colección de entradas se centrarán en preguntas que he recibido en alguna entrevista de trabajo, que son recurrentes y que por básicas más de una vez te pueden pillar en un renuncio.

Atención, pregunta de entrevista, diferencia entre una clase abstracta y una «clase normal».

En nuestra vida como desarrollador de Java, llegará el momento de preguntarnos si nos interesa que la clase que estamos desarrollando sea instanciada o no, hay varias razones para que no deseemos que no se creen objetos a partir de ella, lo más habitual es que esa clase sea una «superclase» que tiene métodos o variables comunes a otras y para evitar repetir código, lo juntamos todo en ella y extendemos.

Vamos a un ejemplo básico y pegamos un pequeño repaso a la programación orientada a objetos (POO). Nos ponen sobre la mesa una base de datos donde iremos almacenando distintos vehículos (con columnas como «matrícula», «marca», «modelo»), como nos encanta la POO, nos ponemos a crear clases para cada uno de ellos (coche, motocicleta, furgoneta…), pero nos damos cuenta de que estamos repitiendo variables, todos tienen matrícula, marca, modelo, podemos poner todo lo que tienen en común en una única clase y extender de ella, de esta forma nace la clase «Vehiculo».

public class Vehiculo {
	
	private String marca;
	private String modelo;
	private String matricula;
	private String color;

	
	public String getMarca() {
		return marca;
	}
	public void setMarca(String marca) {
		this.marca = marca;
	}
	public String getModelo() {
		return modelo;
	}
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
	public String getMatricula() {
		return matricula;
	}
	public void setMatricula(String matricula) {
		this.matricula = matricula;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
}

De ella empezamos a extender cada uno de los tipos de vehículos, pero en ellos ponemos variables que son únicas para ellas (poner aire acondicionado en una moto o elevalunas eléctrico, extraño ¿verdad?).

	private Integer numPuertas;
	private Boolean aireAcondicionado;
	private boolean elevalunas;

	public Integer getNumPuertas() {
		return numPuertas;
	}
	public void setNumPuertas(Integer numPuertas) {
		this.numPuertas = numPuertas;
	}
	public Boolean getAireAcondicionado() {
		return aireAcondicionado;
	}
	public void setAireAcondicionado(Boolean aireAcondicionado) {
		this.aireAcondicionado = aireAcondicionado;
	}
	public boolean isElevalunas() {
		return elevalunas;
	}
	public void setElevalunas(boolean elevalunas) {
		this.elevalunas = elevalunas;
	}
public class Motocicleta extends Vehiculo {
	private String tipoCarenado;

	public String getTipoCarenado() {
		return tipoCarenado;
	}

	public void setTipoCarenado(String tipoCarenado) {
		this.tipoCarenado = tipoCarenado;
	}

}

Creadas nuestras clases, ya podemos instanciarlas.

		Coche coche = new Vehiculo();
		coche.setColor("azul");
		coche.setMarca("Reanult");
		coche.setModelo("Clio");
		coche.setMatricula("76789-OMD");
		coche.setAireAcondicionado(true);

Coche, motocicleta pueden ser creados a partir de Vehiculo, esto no está mal, pero puede que no nos interese que se instancien objetos de tipo Vehiculo y que cada uno se cree con el suyo propio, pues ahí llega el momento de convertir la clase Vehiculo en abstracta, esto se consigue simplemente añadiendo abtract después de public.

public abstract class Vehiculo {

Ya tenemos nuestra clase abstracta con todo lo que tenemos en común y que simplemente nos sirve para hacer un códígo más limpio en las demás clases que extiendan de ella, si ahora intentas extender de ella obtendréis un error.

Este es un ejemplo muy sencillo y poco valioso, en mi caso lo más habitual para acudir a las clases abstractas es para no repetir código, cuando empiezas a repetir métodos en todas las clases esto es una buena pista para ponerlo todo en una única y extender a partir de ella.

Todo el código que haga lo iré subiendo a GitHub, así que este pequeño ya lo teneis.

Otro día le damos un siguiente paso a esto, los métodos abstractos.

Dejar una contestacion

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *