lunes, 28 de julio de 2008

Tips para el SCJP III

Ahora veremos dos temas muy importantes y algo complicados de entender. Override y overload, sobreescritura y sobrecarga. Además dos temas sencillos, relaciones y referencias.

Relaciones

  • Relación “Es Un”
  • Esta relación esta basada en el concepto de herencia o implementación de una interfaz. “Es un” quiere decir, “esta cosa es de tipo esta otra cosa”. Por ejemplo un Cocker es un tipo de Perro, en terminos de POO “Cocker Es Un Perro”. En java se usan las palabras reservadas extends e implements (para interfaces)
  • Una clase solo puede tener un padre, es decir no hay herencia múltiple. Solo puede extender de una sola clase.
  • La relación “Tiene Un”
  • Están basadas en uso más que en herencia. En otras palabras, la clase A Tiene Un B si código de la clase A hace referencia a una instancia de la clase B.
Referencias
  • 1. Una referencia puede ser de un solo tipo y una vez declarada ese tipo nunca puede ser cambiado (no obstante el objeto al que referencia si puede cambiar)
  • 2. Una referencia es una variable, por lo tanto puede ser reasignada a diferentes objetos (excepto cuando es declarada como final).
  • 3. El tipo de una referencia determina que métodos pueden ser invocados en el objeto que esta referenciando (muy importante).
  • 4. Una referencia puede “referenciar” a un objeto de ese mismo tipo o a una subclase del tipo declarado.
  • 5. Una referencia puede ser de un tipo de clase o de una interfaz. Si es de interfaz entonces cualquier objeto que implemente esa interfaz puede ser referenciado.
  • 6. El tipo de referencia (no el tipo del objeto), determina que métodos van a ser llamados.
Polimorfirmo y sobreescritura (Override)
  • Polimorfismo es que puedes tratar cualquier subclase de X como X. En otras palabras, puedes escribir código en una clase Z y puedes decir, “No me importa que tipo de objeto seas, siempre y cuando hayas heredado (extendido) de X haz esto”.
  • Siempre que tienes una clase que hereda de una superclase, entonces existe la posibilidad de sobreescribir (Override) el método (a menos que este marcado como final). El beneficio de la sobreescritura es que puedes definir comportamientos específicos para cada subclase en especial.
  • Los métodos polimórficos se pueden aplicar a métodos que hayan sido sobrescritos en métodos de instancia
Las reglas para sobrescribir (override) métodos son:
  • 1. La lista de argumentos debe ser exactamente igual que el método a sobrescribir. Si no son iguales entonces se hará una sobrecarga (cosa que no se deseaba)
  • 2. El tipo de retorno debe ser igual o de una subclase que en la versión original
  • 3. El nivel de acceso no puede ser más restrictivo.
  • 4. El nivel de acceso Si puede ser manos restrictivo.
  • 5. Los métodos de instancia pueden ser sobrescritos sólo si fueron heredados por la subclase.
  • 6. Una subclase en el mismo paquete que la superclase puede sobrescribir cualquier método que no sea marcado como private o final. Una subclase en un paquete diferente puede sobrescribir solo aquellos métodos que estén marcados como public o protected.
  • 7. Los métodos sobrescritos no puede lanzar nuevas o “mayores” excepciones que las de la superclase. Por ejemplo, un método que declara una ArchivoNoEncontradoException no puede sobrescrito por un método que declare una SQLException o Exception, a menos que sea una subclase de ArchivoNoEncontradoException.
  • 8. El método de la subclase puede lanzar menos o “menores” excepciones.
  • 9. No se puede sobrescribir un método declarado como final
  • 10. No se puede sobrescribir un método declarado como static
  • 11. Si un método no puede ser heredado entonces no se puede sobrescribir. Recuerda que los métodos sobrescritos implican que estas reimplementando un método que heredaste.
  • 12. Deben de tener el mismo tipo de retorno. En Java 5 el tipo puede ser una subclase, esto se conoce como covariant retun.
Es común que desees usar la versión de la superclase de un método y además sobrescribirlo con cosas extras. Esto es fácil de hacer con la palabra reservada super.

Sobrecarga de métodos (Overload)
Los métodos sobrecargados te dan la posibilidad de reusar un nombre de método en una clase, pero teniendo diferentes argumentos (y opcionalmente diferente tipo de retorno).
Las reglas para sobrecargar métodos son:
  • 1. Los métodos sobrecargados deben cambiar la lista de argumentos.
  • 2. Los métodos sobrecargados pueden cambiar el tipo de retorno.
  • 3. Los métodos sobrecargados pueden cambiar el modificador de nivel de acceso.
  • 4. Los métodos sobrecargados pueden declarar nuevas o mayores excepciones
  • 5. Un método sobrecargado puede estar en la misma clase o en una subclase ya que los métodos se pueden heredar y una subclase puede definir otro método sólo en esa subclase.
La elección de qué método sobrecargado se va a llamar NO se decide dinámicamente en tiempo de ejecución. Hay que recordar que el tipo de la referencia(no del objeto) determina que método sobrecargado va a ser invocado.

En resumen:
La versión del método sobrescrito se decide dinámicamente basado en el tipo del objeto. Pero lLa elección del método sobrecargado se basa en el tipo de la referencia en tiempo de compilación.

No hay comentarios: