Professional Documents
Culture Documents
Polimorfismo
Polimorfismo: es la capacidad que tiene el objeto de responder a la misma
llamada de un método de diferentes formas.
El polimorfismo se ve en la sobreescritura , no en la sobrecarga.
Recuerda, cualquier objeto Java que puede pasar mas de un test IS-A, puede
ser considerado polimórfico. Todos sabes que el padre de todas las clases es
la clase Object. Por tal podemos decir que todos los objetos son polimórficos
para Object.
Recuerda que la única forma de acceder a un objeto es através de una
variable de referencia. Entonces es bueno que recuerdes lo siguiente:
*Una variable de referencia puede ser de un solo tipo, y una vez declarada,
ese tipo nunca puede ser modificado (aunque el objeto al que hace
referencia puede cambiar).
*Una referencia es una variable, por lo que pueden ser reasignados a otros
objetos, (a menos que la variable se declare final).
*Una variable de referencia puede ser declarada como un tipo clase o un tipo
interface. Si la variable se declara como un tipo interface, esta puede
referenciar a cualquier objeto que implemente la interface.
Mostramos este pequeño ejemplo de polimorfismo aunque faltan las otras
clases donde esta la sobreescrituras de métodos etc..
Sobreescritura y sobrecarga
Reglas para los métodos sobreescritos(overriding):
*Los métodos pueden ser sobreescritos sólo si son heredados por la
subclases.
*La lista de argumentos debe coincidir exactamente(número de argumentos
y tipo) con la de los método sobreescritos. Si no coinciden lo que se estaría
haciendo es un sobrecarga(overload).
*El tipo de retorno debe ser el mismo o de un subtipo del tipo de retorno
declarado en el método sobreescrito(covariant return). P.e.: Si el método
sobreescrito retorna Object, el método que sobreescribe puede retornar un
String.
*El nivel de acceso de los métodos que sobreescriben no puede ser más
restrictivo que los métodos sobreescritos, por el contrario si pueden ser
menos restrictivos. P.e: Si el método sobreescrito tiene un nivel de acceso
protected entonces el método que sobreescribe no puede ser private, PERO
si puede ser public
*El método que sobreescribe puede lanzar(throw) cualquier excepción de
tiempo de ejecución (uncheked(runtime) exception). Independientemente de
si el método sobreescrito declara la excepción.
*El método que sobreescriben no puede lanzar(throw) cualquier excepción
que sea de mayor jerarquía o diferente que la declarada por el método
sobreescrito. Por ejemplo si un método declara un throw IOException el
método que sobreescribe no puede declarar un throw SQLException o un
throw Exception, ya que la primera no es igual y la segunda está por encima
de la jerarquía de IOException. En cambio sí podría sobreescribirse con un
método que declare un FileNotFoundException, ya que ésta esta por debajo
de la jerarquía de IOException.
*Los métodos que sobreescriben pueden o no volver a declarar el throws
declarado por el método sobreescrito.
*No se puede sobreescribir un método final.
* No se puede sobreescribir un método static.
*Si un método no puede ser heredado, tu no puedes sobreescribirlo. Si por
ejemplo la clase padre tiene un método private String eat() y una subclase de
esta tiene un método public String eat(), aparentemente se está
sobreescribiendo porque un método que sobreescribe si puede tener como
nivel de acceso a uno menos restrictivo que el método sobreescrito, pero en
realidad no se está sobreescribiendo. En esta situación el compilador no
marca error, pero tener en claro que no se está sobreescribiendo, solo se
está creando un método nuevo con el mismo nombre dentro de la clase.
Reglas para los métodos sobrecargados (overloaded methods)
*Deben cambiar la lista de argumentos (el tipo o el número de argumentos).
*Pueden cambiar el tipo de retorno.
*Pueden cambiar el modificador de acceso.
*Pueden declarar excepciones nuevas o más amplias.
*Un método puede ser sobrecargado en la misma clase o en una subclase.
Recuerda esto: