Está en la página 1de 18

Herencia y Polimorfismo

Definiciones
Herencia: es el mecanismo que permite definir una clase de objetos tomando
como base la definición de otra clase. En donde la clase Base es la clase de partida
mientras la clase derivada es la clase que hereda las características y
comportamiento de la clase base
Tipos:
 Simple: Cuando la clase Derivada hereda de una sola clase Base.
 Múltiple: Cuando la clase Derivada hereda de varias clase Base.
Ventajas:
 Recoge los aspectos comunes de dos o mas clases.
 Reutilización de código.
 Mientras mas se profundice en el mecanismo de herencia mas
especializada será la clase resultante, lo que da lugar a una jerarquía de
clases.

Polimorfismo: habilidad de dos o mas objetos pertenecientes a clase diferentes


a responder al mismo mensaje de manera diferente.
Herencia
En Java este proceso de derivación se lleva a cabo usando la palabra reservada extends
que permite crear clases derivadas, siguiendo el siguiente formato:
public class Id_clase_derivada extends Id_clase_base {
private miembro_privado
public miembro_publico
}
Una vez definida la clase derivada se agregan los nuevos miembros que se requieren para
cumplir las necesidades especificas de la nueva clase.
Que heredan las clases derivadas
 Los miembros públicos y protegidos
 No se heredan los miembros privados ni los constructores.
Al derivar una clase
 Se heredan todas los métodos públicos de la clase Base
 Se puede añadir nuevos métodos a la clase derivada.
La nueva clase puede elegir para las métodos heredados:
 Redefinir el método:
 la nueva operación puede usar la del padre y hacer más cosas
 Puede ser totalmente diferente.
 Dejarlo como está
Sobreposición: implica reescribir como un método trabaja sin cambiar el encabezado
del mismo.
Constructores en herencia
Una clase derivada es una especialización de una clase base, por lo que, el constructor
de la clase base debe ser llamado primero, de este modo se creara un objeto de la
clase base, antes de que el constructor de la clase derivada realice su trabajo, es decir
el objeto de la clase base debe existir primero antes de que se convierta en un objeto
de la clase derivada. Resumiendo:
 El constructor de la clase base se invoca primero que el de la clase derivada.
 Si una clase base es a su vez una clase derivada sus constructores se invocan
también en secuencia.
Formato del constructor de la derivada:

public Id_constructor_clase_derivada (lista_parametros) {


super (lista_parametros); // Invoca al constructor clase base
//cuerpo constructor clase derivada
}

El constructor de la clase base se invoca usando: super (parámetros); la llamada a


“super” debe ser la primera instrucción del constructor de la clase derivada.

Para invocar un método de la clase base que tiene en la clase derivada un método con
el mismo nombre: super.IdMetodo (parametros);
Conversión de objetos de la clase derivada y la clase base
Al declarar una clase como derivada de otra clase, los objetos de la clase
derivada son a su vez objetos de la clase base. Un lenguaje que soporte
la programación orientada a objetos hace una conversión automática de
una referencia de clase derivada a referencia a clase base. Es decir que
con una referencia de la clase base podemos referenciar objetos de la
clase derivada, lo contrario no es posible.

Modificador de acceso protected


Modificadores de acceso para miembros de clases:
 public: accesible desde todo el programa
 private: accesible sólo por los miembros de la clase a la que pertenece
 protected: accesible desde sus clases derivadas
Uso recomendado del modificador de acceso protected
Regla general: todos los atributos de una clase son privados se proporcionaran
métodos públicos para leer (get) y/o cambiar (set) los atributos, pero sólo cuando
sea necesario, en el caso de que se desee que un campo sólo pueda ser leído
y/o cambiado por las clase derivada se hacen métodos protected
Polimorfismo
La palabra polimorfismo viene de “múltiples formas”
Las métodos polimórficas son aquellas que hacen funciones similares con objetos
diferentes. En el contexto de la programación orientada a objetos el polimorfismo
está relacionado con variables, asignaciones y métodos.
 Una variable polimórfica puede quedar asociada a objetos de diferentes
clases.
 Una asignación polimórfica liga un objeto de una clase a una variable
declarada de otra clase
El polimorfismo en Java consiste en dos propiedades:
 Una referencia a una clase base puede apuntar a un objeto de cualquiera de
sus clases derivadas.
 El método se selecciona en base al tipo objeto, no a la de la referencia.

Dado que una variable puede estar asociada a objetos de diferentes tipos,
distinguiremos entre:
 El tipo estático de una variable, es el tipo que aparece en la declaración
 El tipo dinámico de una variable es la clase a la que pertenece el objeto
referenciado
 El tipo estático lo determina el compilador, el tipo dinámico se establece en
tiempo de ejecución.
Ligadura Dinámica de código
La ligadura dinámica es la vinculación entiempo de ejecución de un mensaje con
un método. Esto es, cuando un método definido en una clase, queda redefinido
en una clase derivada, el tipo dinámico de la variable determina qué método va
a ejecutarse en respuesta a un mensaje.
El tipo estático de la variable determina los mensajes que un objeto puede
recibir, pero el tipo dinámico determina la implementación específica del
comportamiento que se ejecuta en respuesta a los mensajes. Es decir, el
compilador chequea la validez de un mensaje considerando el tipo estático de la
variable. En ejecución, el mensaje se liga con el método, considerando el tipo
dinámico.

Arreglos de objetos de distintos tipos


Gracias al polimorfismo es posible que un arreglo contenga referencias a objetos de
distintas clases. Esto se logra al declarar el arreglo del tipo de la clase base, con lo
cual tendremos un arreglo del referencias del tipo de la clase base con las que
podremos referenciar objetos de las clases derivas.
Clases abstractas
Es posible crear clases de las que no pretendemos crear objetos
 Su único objetivo es que sirvan de clase base a las Clases Concretas
(clases concretas clases que se pueden instanciar).
 A ese tipo de clases las denominaremos Clases Abstractas.

Las clases abstractas en Java se identifican mediante la palabra reservada abstract


public abstract class IdClase {
.......................
}
Es un error tratar de crear un objeto de una clase abstracta.
Pero NO es un error utilizar referencias de clases abstractas, que pueden apuntar
a objetos de cualquiera de sus clases derivadas, como ocurría con las referencias
a clases bases no abstractas.

Una clase Abstracta puede tener:


 Atributos como cualquier clase concreta
 Métodos como cualquier clase concreta.
 Métodos Abstractos. (NO necesariamente pero si los tiene la clase será
necesariamente Abstracta)
Métodos abstractos
Una clase abstracta puede tener métodos abstractos
• Se trata de métodos sin cuerpo
• Que es obligatorio redefinir en las subclases no abstractas
• Formato de método abstracto:
public abstract int IdMétodoAbstracto (Parametros);

Si una clase hereda de una clase abstracta y no implementa todos los métodos
abstractos, también debe ser definida como abstracta. El constructor de una clase
abstracta sólo va a ser invocado desde los constructores de las clases derivadas. Una
clase concreta debe implementar todos los métodos abstractos de sus clases
abstractas.
Escenario: Figuras 3D
En un archivo llamado “Figuras.txt” se almaceno
la siguiente información:
Tipo de figura (1: Esfera, 2: Cilindro) y la(s)
dimensión(es) de la figura
En el proyecto creado procesar la información
anterior con los siguientes requerimientos
mínimos:
Crear en un paquete llamado Geometría las
siguientes clases:
 Una clase llamada Círculo, la cual tendrá como atributo protegido el
radio del círculo, con los siguientes métodos: un constructor que
recibirá como argumento el radio del círculo, un método que muestre el
atributo de la clase, uno que calcule el área y otro que calcule el
volumen.
 Derivar de Círculo la clase Esfera, con los métodos correspondientes.
 Derivar de Circulo Cilindro, la cual tendrá como atributo privado la
altura del cilindro, con los métodos correspondientes.
 Una clase llamada Apoyo en la cual definirá los métodos siguientes:
 Que determine la cantidad de registros que hay en el archivo “Figuras.txt”.
 Que lea el contenido del archivo “Figuras.txt” y lo almacene en un arreglo
del tipo Círculo el cual será pasado como parámetro al método.
 Que muestre en contenido del arreglo de tipo círculo en el cual se almaceno
la información del archivo “Figuras.txt”.
 Que muestre por consola el menú de opciones tal como se muestra en la
figura y retorne un valor entero con la opción seleccionada.
 Crear la clase Principal con el método main( ) en el cual se declararan las
variables y arreglos, y se invocaran los métodos definidos en la clase Apoyo.

También podría gustarte