G.Bordel >Docencia >TAP Técnicas Actuales de Programación (curso 2010-2011)
desprotegido Intro. desprotegido Temario desprotegido Calendario desprotegido RPF desprotegido Recursos protegido Práctica protegido Gest. Alum.
tema_anterior Tema 4: Elementos relacionados con la orientación a objeto tema_siguiente
  1. Objetos y clases.
  2. Estructura de la definición de una clase.
  3. Herencia.
  4. Encapsulamiento (ámbitos de accesibilidad).
  5. El bloque static y los atributos static y final.
  6. Instanciación, inicialización y eliminación de objetos.[ejercicios]
  7. Clases y métodos abstractos.[ejercicios]
  8. Interfaces.[ejercicios]
  9. Polimorfismo.
  10. Arrays*.[ejercicios]
  11. Enumeraciones.

4.9- Polimorfismo

Palabras reservadas en Java
abstractbooleanbreakbytecasecatch
charclassconst*continuedefaultdo
doubleelseextendsfinalfinallyfloat
forgoto*ifimplementsimportinstanceof
intinterfacelongnativenewpackage
privateprotectedpublicreturnshortstatic
strictfp**superswitchsynchronizedthisthrow
throwstransienttryvoidvolatilewhile

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").


 1-
 2-
 3-


private  Pajaro  gorrion=new Pajaro();
private  Animal  gorrion_A=gorrion;
private  Volador gorrion_V=gorrion;

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.


 1-
 2-


private  Animal  gorrion_A = new Pajaro();
private  Pajaro  gorrion = (Pájaro) gorrion_A;

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".

Apéndice: el operador 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.