Está en la página 1de 3

CAPITULO 9.

ALGO MAS SOBRE HERENCIA

9.2 Tipo esttico y tipo dinmico

Denominamos tipo esttico al tipo declarado de una variable en el cdigo fuente, la representacin esttica del programa.

Denominamos tipo dinmico al tipo del objeto almacenado en una variable porque depende de su asignacin en tiempo de
ejecucin, el comportamiento dinmico del programa.

Si con una variable invocamos un mtodo que el tipo dinmico tiene, pero el esttico no, el compilador informa de un error
porque cuando controla los tipos usa el tipo esttico. El tipo dinmico se conoce, frecuentemente, slo en tiempo de ejecucin
por lo que el compilador no tiene otra opcin ms que usar el tipo esttico cuando quiere hacer alguna verificacin de tipos en
tiempo de compilacin.

9.3 Sobrescribir

Sobreescritura (redefinicin). Una subclase puede sobrescribir la implementacin de un mtodo. Para hacerlo la subclase
declara un mtodo con la misma signatura que la superclase pero con un cuerpo diferente. El mtodo que sobrescribe tiene
precedencia cuando se invoca sobre objetos de la subclase.

9.4 Bsqueda dinmica del mtodo

El control de tipos que realiza el compilador es sobre el tipo esttico, pero en tiempo de ejecucin los mtodos que se
ejecutan son los que corresponden al tipo dinmico.

Veamos con ms detalle cmo se invocan los mtodos. Este procedimiento se conoce como bsqueda de mtodo, ligadura de
mtodo o despacho de mtodo.

Suponga que tenemos un objeto de clase DVD almacenado en una variable v1 declarada de tipo DVD. La clase DVD tiene
un mtodo imprimir y no tiene declarada ninguna superclase. Esta es una situacin muy simple que no involucra herencia ni
polimorfismo. Luego, ejecutamos la sentencia v1.imprimir ();

l. Se accede a la variable v1.


2. Se encuentra el objeto almacenado en esa variable (siguiendo la referencia).
3. Se encuentra la clase del objeto (siguiendo la referencia es instancia de).
4. Se encuentra la implementacin del mtodo imprimir en la clase y se ejecuta.

A continuacin, vemos la bsqueda de un mtodo cuando hay herencia. El escenario es similar al anterior, pero esta vez la
clase DVD tiene una superclase, Elemento, y el mtodo imprimir est definido slo en la superclase. Ejecutamos la misma
sentencia. La invocacin al mtodo comienza de manera similar: se ejecutan nuevamente los pasos l al 3 del escenario anterior
pero luego contina de manera diferente:

4. No se encuentra ningn mtodo imprimir en la clase DVD.


5. Dado que no se encontr ningn mtodo que coincida, se busca en la superclase un mtodo que coincida. Si no se
encuentra ningn mtodo en la superclase, se busca en la siguiente superclase (si es que existe). Esta bsqueda contina
hacia arriba por toda la jerarqua de herencia de la clase hasta Object o hasta que se encuentre definitivamente un mtodo.
Tenga en cuenta que, en tiempo de ejecucin, debe encontrarse definitivamente un mtodo que coincida, de lo contrario la
clase no habra compilado.
6. En nuestro ejemplo, el mtodo imprimir es encontrado en la clase Elemento y es el que ser ejecutado.

Este escenario ilustra la manera en que los objetos heredan los mtodos. Cualquier mtodo que se encuentre en la superclase
puede ser invocado sobre un objeto de la subclase y ser correctamente encontrado y ejecutado.

Ahora llegamos al escenario ms interesante: la bsqueda de mtodos con una variable polimrfica y un mtodo sobrescrito.
El escenario nuevamente es similar al anterior pero existen dos cambios:
El tipo declarado de la variable v1 ahora es Elemento, no DVD.
El mtodo imprimir est definido en la clase Elemento y redefinido (o sobrescrito) en la clase DVD.
Los pasos que se siguen para la ejecucin del mtodo son exactamente los mismos pasos 1 al 4 del primer escenario.

Es importante hacer algunas observaciones:


No se usa ninguna regla especial para la bsqueda del mtodo en los casos en los que el tipo dinmico no sea igual al tipo
esttico. El comportamiento que observamos es un resultado de las reglas generales.

1
El mtodo que se encuentra primero y que se ejecuta est determinado por el tipo dinmico, no por el tipo esttico. En otras
palabras, el hecho de que el tipo declarado de la variable v1 ahora es Elemento no tiene ningn efecto. La instancia con la que
estamos trabajando es de la clase DVD, y esto es todo lo que cuenta.
Los mtodos sobrescritos en las subclases tienen precedencia sobre los mtodos de las superclases. Dado que la bsqueda
de mtodo comienza en la clase dinmica de la instancia (al final de la jerarqua de herencia) la ltima redefinicin de un
mtodo es la que se encuentra primero y la que se ejecuta.
Cuando un mtodo est sobrescrito, slo se ejecuta la ltima versin (la ms baja en la jerarqua de herencia). Las versiones
del mismo mtodo en cualquier superclase no se ejecutan automticamente.

9.5 Llamada a super en mtodos

Para llamar al mtodo sobrescrito de la superclase desde la subclase escribiremos:


public void <NombreMetodo>(){
super.<NombreMetodo>();
}

Al contrario que las llamadas a super en los constructores, el nombre del mtodo de la superclase est explcitamente
establecido. Una llamada a super en un mtodo siempre tiene la forma super.<nombre-del-mtodo>(<parmetros>).

Nuevamente, y en contra de la regla de las llamadas a super en los constructores, la llamada a super en los mtodos puede
ocurrir en cualquier lugar dentro de dicho mtodo. No tiene por qu ocurrir en la primera sentencia.

Al contrario que en las llamadas a super en los constructores, no se genera automticamente ninguna llamada a super y
tampoco se requiere ninguna llamada a super, es completamente opcional. De modo que el comportamiento por defecto
presenta el efecto de un mtodo de una subclase ocultando completamente (sobrescribiendo) la versin de la superclase del
mismo mtodo.

9.6 Mtodo polimrfico

Mtodo polimrfico. Las llamadas a mtodos en Java son polimrficas. El mismo mtodo puede invocar en diferentes
momentos diferentes mtodos dependiendo del tipo dinmico de la variable usada para hacer la invocacin.

9.7 Mtodos de Object

La superclase universal Object implementa algunos mtodos que, por tanto, forman parte de todos los objetos. El ms
interesante de estos mtodos es toString.

El propsito del mtodo toString es crear una cadena de representacin de un objeto. Esto es til para cualquier objeto que
pueda ser representado textualmente en la interfaz de usuario pero tambin es de ayuda para todos los otros objetos; por
ejemplo, los objetos pueden ser fcilmente impresos con fines de depuracin de un programa. En Object el valor de retorno de
toString muestra simplemente el nombre de la clase del objeto y un nmero que representa la direccin de memoria donde el
objeto est almacenado

Cada objeto en Java tiene un mtodo toString que puede usarse para devolver un String de su representacin. Tpicamente,
para que resulte til un objeto debe sobrescribir este mtodo.

Los mtodos System.out.print y System.out.println son especiales con respecto a esto: si el parmetro de uno de estos
mtodos no es un objeto String, el mtodo invoca automticamente al mtodo toString de dicho objeto.

9.8 Acceso protegido

Los lenguajes orientados a objetos frecuentemente definen un nivel de acceso que est entre medias de la restriccin
completa del acceso privado y la total disponibilidad del acceso pblico. En Java este nivel de acceso se denomina acceso
protegido.

La declaracin de un campo o un mtodo como protegido (protected) permite su acceso directo desde las subclases (directas
o indirectas).

El acceso protegido permite acceder a los campos o a los mtodos dentro de una misma clase y desde todas las subclases,
pero no desde otras clases.

Mientras que el acceso protegido puede aplicarse a cualquier miembro de una clase, generalmente se reserva para los
mtodos y los constructores; no es frecuente aplicarlo en los campos porque debilitara el encapsulamiento. Siempre que sea

2
posible, los campos modificables de las superclases deberan permanecer privados. Sin embargo, existen casos vlidos
ocasionales en los que es deseable el acceso directo desde una subclase. La herencia representa una forma mucho ms cerrada
de acoplamiento que una relacin normal de cliente.

La herencia vincula las clases de manera muy cercana y la modificacin de la superclase puede romper fcilmente la
subclase. Este punto debiera tenerse en consideracin cuando se disean las clases y sus relaciones.

También podría gustarte