438
Capítulo 10 Programación orientada a objetos: polimorfi smo
como la subclase puede tener miembros adicionales que sólo pertenezcan a esa subclase, no se permite asignar una
referencia de la superclase a una variable de la subclase sin una conversión explícita; dicha asignación dejaría los
miembros de la subclase indefi nidos para el objeto de la superclase.
En esta sección y en la sección 10.3, además del capítulo 9, hemos visto cuatro maneras de asignar referencias
de una superclase y de una subclase a las variables de los tipos de la superclase y la subclase:
1.
Asignar una referencia de la superclase a una variable de la superclase es un proceso simple y directo.
2.
Asignar una referencia de la subclase a una variable de la subclase es un proceso simple y directo.
3.
Asignar una referencia de la subclase a una variable de la superclase es seguro, ya que el objeto de la
subclase
es un objeto de su superclase. No obstante, esta referencia puede usarse para referirse sólo a los
miembros de la superclase. Si este código hace referencia a los miembros que pertenezcan sólo a la sub-
clase, a través de la variable de la superclase, el compilador reporta errores.
4.
Tratar de asignar una referencia de la superclase a una variable de la subclase produce un error de com-
pilación. Para evitar este error, la referencia de la superclase debe convertirse en forma explícita a un
tipo de la subclase. En tiempo de ejecución, si el objeto al que se refi ere la referencia no es un objeto de
la subclase, se producirá una excepción. (Para más información sobre el manejo de excepciones, vea el
capítulo 13, Manejo de excepciones). El operador
instanceof
puede utilizarse para asegurar que dicha
conversión se realice sólo si el objeto es de la subclase.
10.6 Métodos y clases
final
En la sección 6.10 vimos que las variables pueden declararse como
final
para indicar que no pueden modifi carse
una vez que se inicializan; dichas variables representan valores constantes. También es posible declarar métodos,
parámetros de los métodos y clases con el modifi cador
final
.
Un método que se declara como
final
en una superclase no puede sobrescribirse en una subclase. Los méto-
dos que se declaran como
private
son implícitamente
final
, ya que es imposible sobrescribirlos en una subclase.
Los métodos que se declaran como
static
son implícitamente
final
. La declaración de un método
final
nunca
puede cambiar, por lo cual todas las subclases utilizan la misma implementación del método, y las llamadas a los
métodos
final
se resuelven en tiempo de compilación; a esto se le conoce como
vinculación estática
. Como el
compilador sabe que los métodos
final
no se pueden sobrescribir, puede optimizar los programas eliminando las
llamadas a los métodos
final
, y reemplazándolas con el código expandido de sus declaraciones en la ubicación de
cada una de las llamadas a los métodos; a esta técnica se le conoce como
poner el código en línea
.
Tip de rendimiento 10.1
El compilador puede decidir poner en línea la llamada a un método
final
y lo hará para los métodos
final
pequeños
y simples. La puesta en línea no quebranta los principios del encapsulamiento o de ocultamiento de la información,
pero sí mejora el rendimiento, ya que elimina la sobrecarga que se produce al realizar la llamada a un método.
Una clase que se declara como
final
no puede ser una superclase (es decir, una clase no puede extender a
una clase
final
). Todos los métodos en una clase
final
son implícitamente
final
. La clase
String
es un ejemplo
de una clase
final
. Esta clase no puede extenderse, por lo que los programas que utilizan objetos
String
pueden
depender de la funcionalidad de los objetos
String
, según lo especifi cado en la API de java. Al hacer la clase
final
también se evita que los programadores creen subclases que podrían ignorar las restricciones de seguridad. Para
obtener más información sobre las clases y métodos
final
, visite
java.sun.com/docs/books/tutorial/java/
IandI/final.html
. Este sitio contiene información adicional acerca de cómo usar clases
final
para mejorar la
seguridad de un sistema.
Error común de programación 10.5
Tratar de declarar una subclase de una clase
final
es un error de compilación.
Observación de ingeniería de software 10.6
En la API de Java, la vasta mayoría de clases no se declara como
final
. Esto permite la herencia y el polimorfi smo: las
características fundamentales de la programación orientada a objetos. Sin embargo, en algunos casos es importante
declarar las clases como
final
; generalmente por razones de seguridad.
10_MAQ_CAP_10.indd438
4/19/081:25:21AM