Herencia Java
Herencia Java
Herencia Java
UNSL-APMDS
Herencia
Es una relación entre las clases en la cual una clase comparte la estructura
y el comportamiento de una (Herencia Simple) o más clases (Herencia
Múltiple).
La clase de la que las otras heredan se llama Superclase.
Análogamente la clase que hereda de otra/s clase/s se llama Subclase.
Beneficios de la Herencia
Reusabilidad de Software: El código que provee el comportamiento
heredado de otra clase no se implementa nuevamente.
Compartición de Código: Componentes de software (para Cox son:
Software-ICs). También se da cuando dos o más clases
heredan de una clase.
Consistencia de Interfaz: Cuando una o más clases heredan de una clase
padre se está seguro que el comportamiento heredado será el
mismo en todos los casos. En este contexto se asume la
herencia sin sobre-escritura.
Componentes de Software: La herencia permite construir componentes
reusables de software.
Beneficios de la Herencia
Prototipado Rápido: Cuando un sistema se puede construir usando
componentes reusables, el tiempo de desarrollo se concentra
en entender la porción del sistema que es nueva e inusual.
Polimorfismo: Permite que el programador pueda definir componentes de
alto nivel que pueden usarse en diferentes aplicaciones
cambiando sus rutinas de bajo nivel.
Información Oculta: Cuando un programador reusa una componente de
software solo necesita conocer la naturaleza de la
componente y su interfaz.
Costos
Velocidad de Ejecución: Los sistemas que usan herencia son generalmente
más lentos que los que son hechos a mano. Esto se debe a
que los métodos heredados deben estar preparados para ser
usados por subclases arbitrarias.
Tamaño del Programa: El uso de bibiotecas de software impone una
penalidad de tamaño sobre el sistema que se está
construyendo.
Costos
Overhead de Pasaje de Mensajes: Pasar un mensaje es una operación más
costosa que una invocación a un procedimiento o función.
Complejidad del Programa: Algunas veces, cuando se hace abuso de la
herencia, entender el flujo del programa requiere navegar
hacia arriba y hacia abajo el grafo de la herencia. Este
problemas se conoce con el nombre de: El problema del
yo-yo.
Personas Empresario
Observaciones
Las dos clases son muy similares. Ambas clases tienen datos y muchas
operaciones en común.
Si se implementan las clases por separado sin observar las
caracterı́sticas en común entonces se duplica el código, es más difı́cil
detectar errores, etc.
Observaciones
Si se aprovechan las similitudes entonces lo que se necesita implementar
son solamente las nuevas caracterı́sticas.
Variables y Métodos
Si B es una subclase de A entonces:
B hereda todas las variables y métodos que no son privados.
B puede definir nuevas variables y métodos de instancia propios.
Variables y Métodos
Una instancia de la clase Empresario
hereda:
Las variables de instancia:
nombre, edad, domicilio, sexo.
Los métodos: demeNombre(),
demeDomicilio(), demeSexo(),
.... etc.
Búsqueda de Métodos
Cuando una instancia recibe un mensaje el método se busca en su clase si
no está allı́ la búsqueda continua en su superclase y ası́ sucesivamente
hasta llegar al tope. En este caso si el método no se encuentra se produce
un error.
Herencia en Java
1 c l a s s A extends B {
2 .......
3 }
Herencia en Java
1 c l a s s E m p r e s a r i o extends P e r s o n a {
2 .......
3 }
Inicialización de Objetos
En el contexto de la Herencia es confuso pensar en el objeto
producido por la clase derivada. Esto se debe a que hay dos clases en
lugar de una.
Desde el exterior se percibe que la nueva clase tiene la misma interfaz
que la clase base y quizás algunos métodos/campos adicionales.
Cuando se crea un objeto de la clase derivada, el mismo contiene un
objeto de la clase base. Este subobjeto se encuentra envuelto dentro
del objeto de la clase derivada.
Inicialización de Objetos
La inicialización de los objetos creados mediante la Relación de Herencia
se realiza en el constructor a través de la invocación del constructor de la
clase base.
Es importante notar que: Java inserta llamadas al constructor de la clase
base en el constructor de la clase derivada.
1 class Arte {
2 Arte () {
3 System . o u t . p r i n t l n ( ” C o n s t r u c t o r de A r t e ” ) ;
4 }
5 }
6
7 c l a s s D i b u j o extends A r t e {
8 Dibujo () {
9 System . o u t . p r i n t l n ( ” C o n s t r u c t o r de D i b u j o ” ) ;
10 }
11 }
12
13 p u b l i c c l a s s DAnimado extends D i b u j o {
14 p u b l i c DAnimado ( ) {
15 System . o u t . p r i n t l n ( ” C o n s t . de DAnimado . ” ) ;
16 }
17 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
18 DAnimado x = new DAnimado ( ) ;
19 }
20 }
1 import s t a t i c n e t . m i n d vi e w . u t i l . P r i n t . ∗ ;
2
3 c l a s s Game {
4 Game ( i n t i ) {
5 p r i n t ( ”Game c o n s t r u c t o r ” ) ;
6 }
7 }
8
9 c l a s s BoardGame extends Game {
10 BoardGame ( i n t i ) {
11 super ( i ) ;
12 p r i n t ( ”BoardGame c o n s t r u c t o r ” ) ;
13 }
14 }
15
16 p u b l i c c l a s s C h e s s extends BoardGame {
17 Chess ( ) {
18 super ( 1 1 ) ;
19 p r i n t ( ” Chess c o n s t r u c t o r ” ) ;
20 }
21
22 p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {
23 C h e s s x = new C h e s s ( ) ;
24 }
25 }
Nivel de Clases
1 Public: la clase es accesible para todas las clases en todas partes.
2 Package: la clase es accesible solo dentro de su paquete.
3 Private: se utiliza para clases internas.
Nivel de Miembros
1 Public: el dato/método miembro es accesible para todas las clases en
todas las partes.
2 Protected: el dato/método miembro es accesible dentro de su propio
paquete y en sus subclases.
3 Package: el dato/método es accesible solo dentro de su paquete.
4 Private: el dato/método es accesible sólo dentro de su clase.