You are on page 1of 3

Jerarquía de Clases

Ing. Diego Enrique Hernández González


6 de octubre de 2010

Conceptos básicos
El propósito de la herencia en la POO es el ahorro de esfuerzo al elaborar el código. A partir de clases
que generalicen el mayor número de características posibles, se pueden declarar otras que tomen esas mismas
características y que además sirvan para tratar casos particulares. Para ello se necesita plantear una jerarquía de
clases.
La jerarquía de clases es un conjunto de clases que describen un concepto ampliamente, desde su caso más
general a sus casos más particulares; se puede ver también como un árbol, donde las clases que están en los
niveles superiores heredan sus atributos y métodos a las que están en los níveles inferiores. Mientras se ascienda
en la jerarquía, aumenta el nivel de abstracción en las clases.
La clase que hereda sus atributos y métodos a otra se le denomina clase padre, clase base o superclase. A la
clase que recibe esa herencia se le llama clase derivada o subclase. Esta herencia puede ser directa, cuando una
superclase hereda sus atributos a una subclase del nivel inmediatamente inferior, o indirecta, cuando hereda sus
atributos a otra que se encuentra 2 o más niveles más abajo en la jerarquía.
Un detalle que no hay que perder de vista: todas las clases en Java, incluso aquellas declaradas por el usuario,
son implícitamente subclases de la clase Object; esta hereda métodos para el manejo de los objetos.

Diseño de una jerarquía de clases


Supongamos que en un proyecto tenemos 3 clases: Auto, Bicicleta y Avión. Podríamos programar cada
clase por separado, pero también podríamos colocar sus atributos y método en común en una clase denominada
Transporte (ejemplos: atributos velocidad y cantidad de pasajeros; métodos acelerar y desacelerar). También
podríamos, si es necesario, manejar casos particulares de cada clase. Desde la clase Auto podríamos derivar
otras como AutoDeportivo, AutoCompacto o Camioneta; al igual que con la clase Transporte, en la clase Auto
se reunirían atributos y métodos que tuvieran en común esas clases derivadas (atributos: número de puertas,
kilometraje; métodos: rellenar el tanque, activar los limpiaparabrisas). Para representar una herencia en el
diagrama de clases ésto se usa una flecha con la punta vacía, tal como en la figura 1.

Implementación de una jerarquía de clases


Supongamos que tenemos una clase llamada ObjetoPadre, con sus atributos y métodos particulares. Si
queremos que otra clase llamada ObjetoHijo herede esos atributos, en el momento de declararla lo indicamos
con la palabra reservada extends:
class ObjetoHijo extends ObjetoPadre {
// Se declaran atributos y métodos que son para esta
// esta clase en particular
}
Para algunas clases del ejemplo, podríamos hacer lo siguiente:
class Avion extends Transporte {
// Se declaran atributos y métodos que son de esta
// clase en particular
// ...

1
Figura 1: Jerarquía de clases. La clase Transporte del diagrama es la superclase de mayor jerarquía.

class Automovil extends Transporte {


// Se declaran atributos y métodos que son de esta
// clase en particular, recuerda que cada clase
// está en un archivo diferente
}

class AutomovilDeLujo extends Automovil {


// ...
}
Al momento de usar de instanciar los objetos de clases que heredan métodos y atributos de clases superiores,
podemos usar de esos métodos y atributos de manera indiscriminada:
class Avion extends Transporte {
// ...

public static void main (String[] args) {


// Declaro 3 objetos de 3 clases distintas, entre estas clases
// se heredan atributos y métodos
Transporte ejemploTransporte = new Transporte();
Automovil ejemploAutomovil = new Automovil();
AutomovilDeportivo ejemploAutoDeportivo = new AutomovilDeportivo();

// en la clase superior solo se puede acceder a los métodos


// que tiene de por sí declarados
ejemploTransporte.acelerar();

// podemos usar los métodos de la clase de orden superior


// tal como si fueran propios, sin necesidad de referirse
// a esa clase
ejemploAutomovil.desacelerar();
int numeroPasajeros = ejemploAutomovil.getNumeroPasajeros();

// y cuando sea necesario podemos hacer uso de los métodos de clase

2
ejemploAutomovil.rellenarTanque(45.67);

// la herencia también cuenta con clases de las cuales no se


// hereda directamente nada. En este caso, estamos haciendo
// uso de los métodos de la clase que esta hasta arriba en
// la jerarquía
ejemploAutoDeportivo.desacelerar();
ejemploAutoDeportivo.setNumeroPasajeros(2);

// en los casos particulares podemos hacer uso de toda la


// gama de atributos y métodos definidos en buena parte de
// la jerarquía
ejemploAutoDeportivo.activarLimpiaParabrisas();
ejemploAutoDeportivo.setCambioManual(true);
ejemploAutoDeportivo.abrirQuemacocos();
ejemploAutoDeportivo.cerrarQuemacocos();
}
}
Para referirnos a la superclase dentro de la subclase, usamos la referencia super, esta nos sirve para acceder
a los elementos de la superclase en cualquier momento.
class Camioneta extends Automovil {
public void setDatoCualquiera() {
...
super.rellenarTanque(); // Estoy llamando dentro
// de este método a uno
// de la clase inmediatamente
// superior

super.acelerar(); // Aplica también para los


// métodos y atributos de clases más
// elevadas en la jerarquía
}
}

You might also like