Herencia

Herencia

La herencia es una de las tres características más importantes en la POO porque permiten que una clase herede los atributos y métodos de otra clase (Los constructores no se heredan, estos son prropios de la clase a la que pertenecen). Esta caracteristica permite la reutilización del código.

Con la herencia todas las clases están clasificadas en una jerrquía estricta. Cada clase tiene una superclase (la clase superior en la jerarquía) también llamada clase base y cada clase puede tener una o más subclases también llamadas clases derivadas. Además hereda todas las variables y los métodos definidos por la superclase y agrega us elementos únicos.

Las clases que están en la parte inferior en la jerarquía se dice que heredan de las clases que están en la parte superior en la jerarquía. El termino heredar significa que las subclases disponen de todos los métodos y propiedades de su superclase. Este mecanismo proporciona una forma rápida y comoda de extender la funcionalidad de una clase. En Java cada clase solo puede tener una superclase o clase base, a lo que llamamos herencia simple.

Java soporta la herencia al permitir que una clase incorpore a otra en su declaración. Esto se hace mediante el uso de la palabra extends. Así la subclase se añade (extiende) la superclase

En el siguiente ejemplo creamos una superclase llamada herencia, que almacena el ancho y la altura de un objeto bidimensional y una subclase llamada Triang, observemos como se usa la palabra extends para crear una subclase:

Obtendremos la siguiente salida:

Veamos un Segundo ejemplo con Herencia, tenemos la clase principal herencia en donde declaramos todas las variables globales a utilizar en todas las subclases y un método que nos muestra alguna información, la Subclase Triang, hereda de la clase Principal las Propiedades y Atributos y calcula mediante un método Interno el área del Triangulo, según sea la opción seleccionada por el usuario

Por último la Clase estilo, (Subclase de herencia), muestra el tipo de triángulo dados los lados de éste

Ayuda

Una vez hecho lo anterior agrega una subclase llamada Cuadrado, otra como Círculo, una más como Esfera y la última llamada Cono. Además de los objetos pertinentes para el manejo de su información. Todo dentro del mismo programa.

Aportación del alumno: David Ariel Hernández Martínez

Aunque FormaDosD es una superclase para Triang es también una clase completamente independiente y autónoma. Ser la superclase de una subclase no significa que la superclase no pueda usarse de manera independiente. Por supuesto, un objeto de FormaDosD no tiene conocimiento de ninguna de sus subclases, ni tiene acceso a ellas.

La sintaxis de la forma general de una declaración de clase que hereda una superclase:

class nombre-subclase extends nombre-superclase {

//Cuerpo de la clase

}

Sólo es posible especificar una superclase para cualquier subclase que cree. Java no soporta la herencia de varias superclases en una sola subclase. Pero es posible crear una jerarquía de herencia en la que una subclase se convierte en la superclase de otra subclase. Por supuesto, ninguna clase puede ser superclase de sí misma.

Acceso a Miembros y Herencia

Cuando la variable de una instancia se declara como private, restringimos su uso no autorizado o modificación. La herencia de clase no sobrescribe la restricción de acceso de private. Por lo tanto, aunque una subclase incluye a todos los miembros de su superclase, está no puede acceder a los miembros de la superclase que se han declarado como private.

Como ejemplo, en tu programa anterior modifica a las variables como private y observa los resultados, ¿Qué sucede?

Pero Java puede utilizar algunos métodos de acceso para proporcionar acceso a los miembros privados de una clase, veamos los cambios con el programa anterior:

Por lo tanto, concluimos que una variable debe de ser private cuando queremos restringir modificaciones desde alguna subclase que descienda de la superclase.

Entonces, cuando debo de hacer que una variable de instancia sea private?, Si utilizamos una variable de instancia únicamente con métodos definidos dentro de su clase o si una variable de instancia debe de estar dentro de ciertos límites, de esa manera evitará que se le asignen valores que no sean válidos dentro de la clase.

Constructores y Herencia

Los constructores son independientes de cada clase, superclase o subclase cada uno cuenta con sus propios constructores ya que una superclase no conoce a los elementos de la subclase y no tiene acceso a ellos, pero una subclase si puede tener acceso al constructor de una superclase.

Podemos introducir argumentos dentro de un constructor, ejemplo:

Cuando la subclase y la superclase definen constructores, el proceso se vuelve más complicado porque ambos constructores deben de ejecutarse, e esté caso Java utiliza la palabra reservada super que funciona de dos formas generales. La primera llama a un constructor de la superclase, la segunda se usa para que un miembro de una subclase acceda a un miembro de la superclase que se ha ocultado.

Uso de super para llamar a constructores de una superclase

Una subclase puede llamar a un constructor definido por la superclase con el uso de la siguiente instrucción super:

super(lista-parámetros);

Cuando decimos lista-parámetros, especificamos cualquier parámetro que el constructor de la superclase necesita. super( ) debe ser siempre la primera instrucción que se ejecute dentro de un constructor de subclase, veamos el siguiente ejemplo:

Lo demás queda igual, concluimos entonces que el constructor de la superclase puede ser llamado con super( ).

Podemos también trabajar con sobrecarga de constructores y por lo tanto utilizar versiones expandidas de constructores en las subclases

Ejemplo:

Ejercicio:

Elabora un Diagrama de Flujo que muestre el funcionamiento del programa anterior, así como sus interacciones entre las clases, los constructores y sus objetos hasta mostrar sus resultados.

Cuando una subclase llama a super( ), está llamando al constructor de su superclase inmediata. Por lo tanto, super( ) siempre hace referencia a la superclase inmediatamente superior a la clase que llama, aunque existan varios niveles de jerarquías. Además está instrucción siempre debe de ser la primera instrucción ejecutada dentro de un constructor de subclase.

Uso de super para acceder a miembros de una superclase

Existe otra forma de super que actúa con this, excepto que siempre elude a la superclase de la subclase en la que es utilizada. Está es su forma general:

super.miembro

Aquí miembro puede ser un método o una variable de instancia.

Está forma de super es más aplicable a situaciones en las que los nombres de miembros de una subclase ocultan a los miembros con los mismos nombres en la superclase.

Por ejemplo:

virj