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