G.Bordel >Docencia >TAP | Técnicas Actuales de Programación | (curso 2010-2011) | |||||||
|
|||||||||
tema_anterior | Tema 4: Elementos relacionados con la orientación a objeto | tema_siguiente |
4.9- Polimorfismo
Palabras reservadas en Java | |||||
abstract | boolean | break | byte | case | catch |
char | class | const* | continue | default | do |
double | else | extends | final | finally | float |
for | goto* | if | implements | import | instanceof |
int | interface | long | native | new | package |
private | protected | public | return | short | static |
strictfp** | super | switch | synchronized | this | throw |
throws | transient | try | void | volatile | while |
El polimorfismo es la capacidad de considerar a un objeto según diferentes "formas" dependiendo de la ocasión. Todo objeto de una determinada clase puede ser considerado como objeto de sus clases ascendientes o como objeto de una "clase identificada por uno de los interfaces que implementa". Se entendrá con el ejemplo visto anteriormente: si se instancia un objeto de la clase "Pajaro", en un momento dado puede tratarse como si fuese de la clase "Animal" (por ejemplo para aplicarle un tratamiento conjunto con otros "animales" que no sean necesariamente "pajaros"), o del mismo modo puede tratarse como si fuese de una clase "Volador" (igualmente por ejemplo para aplicarle un tratamiento conjunto con otros "Voladores" que no sean necesariamente "pajaros").
|
|
Las líneas de código anteriores son perfectamente válidas. En la primera se instancia un objeto de clase Pajaro a través de la referencia "gorrion" y en las dos siguientes se establecen otras referencias al mismo objeto pero declaradas como "Animal" y "Volador" de modo que que través de ellas disponemos de los interfaces específicos de esas dos definiciones ocultandose cualquier otra característica.
El hecho de declarar una referencia de una determinada clase más general que el objeto realmente instanciado no limita la posibilidad de "recuperar" la especificidad del mismo mediante una referencia adecuada. Lo que sí debe suceder en tal caso es que para la asignación se debe utilizar un "cast" que indique el conocimiento por parte del programador de que tal asignación es posible (si resulta no serlo en realidad, se producirá un error en tiempo de ejecución). El siguiente ejemplo muestra esto.
|
|
Un detalle a tener en cuenta es que aunque se acceda a través de una referencia a una clase más general que la del objeto real, en caso de invocar a un método que se encuentre sobreescrito en la clase más específica, será el código específico el que se ejecute. Es decir, el acceso es posible al pertenecer el método al interfaz de la clase más general y esto es "controlado" por el compilador, pero en tiempo de ejecución el comportamiento del objeto es el correcto dada su especificidad. Esto impone una restricción a la hora de sobreescribir métodos en lo que se refiere a los ámbitos de acceso: una sobreescritura de un método no puede restringir el ámbito de acceso (p.ej sobreescribir como "privado" un método que era "público" en la clase padre) ya que en caso de acceso a través de una referencia de la clase padre se estaría permitiendo un acceso ilegal. (hay aún otra limitación en relación con el proceso de errores que se verá en el capítulo correspondiente [§5.2])
En última instancia, como todas las clases heredan de la raiz de la jerarquía -la clase Object
-,
todo objeto java puede ser considerado como un "Object
".
instanceof
En el apartado §3.3 se mencionó el operador
instanceof
, pero no se concretó su función. Una vez visto esto, puede entenderse
ya que consiste simplemente en la determinación de si un objeto pertenece a una clase. Es decir, el operador
se aplica a un objeto y una clase y devuelve true
en caso de que el objeto sea una
instancia de dicha clase teniendo en cuenta el polimorfismo. En caso contrario la evaluación dará
resultado false
. De acuerdo al ejemplo vistos anteriormente tendremos lo siguiente:
gorrion_A instanceof Pajaro --> [true]
gorrion_A instanceof Animal --> [true]
gorrion_A instanceof Object --> [true]
gorrion_A instanceof String --> [false]
Siguiente punto: 4.10- Arrays*
Plataforma de soporte a curso y contenidos (c) German Bordel 2005. |