You are on page 1of 28

Taller de programacin I

Taller de Programacin I
Semana IV
1

Taller de programacin I

Indice

Indice
I II Unidad I: Conceptos de Orientacin a Objetos Aprendizajes esperados
throw y throws throw

03 03 04
08 11

III Entradas y salidas.

IV Colaboracin entre clases. V


Sobre escritura final

13 16
25 26

Herencia

VI Resumen de la Semana VII Sinopsis de la prxima clase

28 28

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Unidad I: Conceptos de Orientacin a Objetos


Aprendizajes esperados
1.7 Desarrolla los conceptos de Herencia, Polimorfismo e Interfaz, dentro de la arquitectura del diseo de clases.

03

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Entradas y salidas.
Dentro del package Java.IO existen ms clases que suelen utilizarse de manera recurrente, las clases que se encuentran dentro de este package estn orientadas a entradas y salidas entandar. Los programas que necesiten realizar una operacin de entrada o salida lo har mediante lo que se conoce como un flujo (stream), este flujo tiene la caracterstica de ser un objeto al cual no le importa desde donde proviene a la informacin o donde debe escribirla, siendo otros los objetos encargados de recibir o adquirir la informacin desde los dispositivos de entrada, estas clases se encuentran dentro del package.io. as que cuando tengas que crear un programa que utilice entradas y salidas, no debes olvidar realizar el siguiente import:

Existen cuatro clases fundamentales para las entradas y salidas, las cuales son: reader, writer, inputStream y outputStream La clase inputStream posee una de los mtodos ms comunes read(), este mtodo realizar una lectura del flujo de entrada leyendo el prximo byte que se encuentre disponible, el valor es devuelto como un entero, el cual representa el valor correspondiente al carcter en la tabla de cdigos ASCII, por ejemplo, si la lectura se realiza desde el teclado, no importar si lo que se presiona es una letra, un nmero o algn carcter el resultado se podr almacenar en un valor de tipo entero sin necesidad de realizar casting. Existe otra clase que tambin utiliza la lectura que provee la clase Reader llamada InputStreamReader, esta clase, se diferencia de inputStream en que el byte ledo es convertido a caracteres, esta clase se recibe como parmetro un objeto de tipo inputStream, es decir el byte que se desea convertir, el cual puedes obtener de la clase System.in, la cual provee una flujo desde el teclado, sin embargo esto dara como resultado lo siguiente, System.in permite la entrada desde el teclado, la entrada es leda como un flujo en byte por InputStreamReader, el resultado que esta clase genera es transformado al carcter correspondiente, sin embargo la lectura se puede mejorar utilizando un flujo buferizado, esto permite ingresar un arreglo de bytes para luego ser ledo de una sola vez, el siguiente cdigo de ejemplo muestra la interaccin entre todas las clases mencionadas para lograr una entrada de datos buferizada por teclado.

El objeto br, es creado a partir de una clase BufferedReader, la cual leer todos los caracteres que leer inputStreamReader a partir de System.in

04

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Nota que el objeto br si bien contiene el comportamiento read() visto antes, es mucho ms conveniente utilizar readLine(), el cual leer una entrada buferizada, es decir todo los bytes que se encuentren disponibles para su lectura, si ejecutamos este comportamiento veremos que la consola quedar a la espera de que el usuario escriba algo en la consola y presione Enter, cuando esto suceda, todos la informacin ser leda y entregada como un String( recuerda que pueden ser varios caracteres). El siguiente cdigo muestra una clase de ejemplo de lectura que podrs utilizar en todos tus programas:

El throws IOException que acompaa la firma del mtodo lectura ser estudiando ms adelante en este mismo captulo.

El nico comportamiento de la clase llamado lectura lee una cadena de caracteres desde el teclado y la retorna, mira ahora como se utilizar esta clase en nuestro programa:

05

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Con este cdigo podemos crear un objeto de tipo lectura y solicitarle que lea una cadena de caracteres desde el teclado sin tener que volver a escribir el cdigo dentro de lectura una y otra vez. Desarrollemos el programa que muestra la excepcin de la divisin en cero para que veas como funciona: Al ejecutar el programa ingresaremos los datos como se muestra a continuacin:

Al ejecutar el programa ingresaremos los datos como se muestra a continuacin:

06

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Apliquemos la sintaxis a nuestro caso:

La lnea que captura el resultado y el que la imprime estn ahora dentro del bloque try, fjese que tenemos un catch, que capturar todos los errores de tipo ArithmeticException que ocurra, por ello esta vez, si se intenta dividir por cero el mensaje de no es posible realizar el clculo ser mostrado y el cdigo continuar ejecutndose de forma normal al finalizar el bloque de try- catch.

07

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

throw y throws
Si prestamos atencin al cdigo realizado antes:

Notaras que throws IOException se encuentra presente en nuestro cdigo, la razn de ello es que la llamada a readLine() puede provocar una excepcin de tipo IOException, cuando produzcas cdigo sensible a lanzar excepciones dentro de un comportamiento, se tienen dos opciones 1. controlarlo utilizando los bloques try-catch 2. o reportar con throws que el comportamiento lanza este error, en dicho caso quien debe utilizar try-catch es el cdigo que consume el mtodo. Si a la clase EntradaSalida vista antes agregamos el siguiente mtodo leerDouble:

08

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Notaremos dos cambios iniciales, el primero corresponde a que el objeto br que antes slo perteneca al mtodo lectura() ahora pertenece a la clase y por ende a todos sus mtodos, el segundo corresponde a que el comportamiento leerDouble reporta que lanza una IOException en caso de error, adicionalmente la lectura del usuario provocara que el texto ingresado sea convertido de String a un double, pero si el usuario no ingresa un valor con el formato correcto Java no podr llevar a cabo dicha accin lanzando una excepcin de tipo NumberFormatException. El problema podemos abordarlo de dos formas: 1. Vamos a reportar que el mtodo lanza una excepcin, dejando la responsabilidad de capturarlo a quien invoque el mtodo:

Para este caso el mtodo leerDouble lanza 2 excepciones, nota que un mtodo puede reportar todas las excepciones que desee, hecho esto el comportamiento Para este caso el mtodo leerDouble lanza 2 excepciones, nota que un mtodo puede reportar todas las excepciones que desee, hecho esto el comportamiento que consume el mtodo lucir as:

09

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Esta solucin intenta recibir en valor el resultado de leerDouble, en caso de que esto falle, nuestro catch capturara cualquier error de tipo NumberFormatException y mostrar el mensaje correspondiente, note adems que sin importar si hubo o no una excepcin al final se muestra al usuario un mensaje con el valor ingresado, que en caso de ocurrir error ser cero (el valor de inicializacin). Fjate que la excepcin de tipo IO no fue necesario controlarla dentro de un bloque catch, esto se debe a que nuestro mtodo main() reporta que de ocurrir un error lanzar el error a quien lo haya invocado, de manera adicional, es importante destacar que si bien el mtodo main(), nunca ejecuta el comportamiento readLine() de forma directa, lo hace de forma indirecta al ejecutar el comportamiento leerDouble del objeto myLector, quien lanza este tipo de excepciones, provocando as una propagacin de la excepcin.

Las excepciones se pueden propagar para una cantidad N de llamadas, sin embargo, para este caso en particular mantener la sentencia throws no presenta mucha utilidad ya que el mtodo main() es el inicio del programa y el error provocar un error al no tratar la excepcin en el flujo del programa, esto tiene una solucin en el try que envuelve las lneas que provocan el error, la solucin est dada por las caractersticas que tienen los try, la cual les permite agregar una N cantidad de catch:

El flujo del programa ser el siguiente, se intentar ejecutar las lneas dentro del try, en caso de no existir, ninguno de los catch es ejecutado, por otra parte, si un error ocurre slo se ejecutara el catch que corresponde a la excepcin ocurrida, en caso de no ser ninguna de las dos, el cdigo fallar al igual como si no hubiese un control de errores.

10

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Todas las excepciones heredan de la clase Exception, la herencia ser un tema tratado ms adelante, sin embargo por ahora ser suficiente con que sepas que cualquier excepcin que ocurra puede ser tratada como una excepcin genrica.

El siguiente cdigo ejecutar el primer catch en caso de que ocurra un error con el formato, el segundo en caso de generar una de entrada de entrada o salida y el tercer catch se ejecutar en caso de que ocurra una excepcin que no sea alguna de las anteriores, esta tcnica es genial, ya que aunque no sepas porque ocurri, el cdigo no se caer y a cambio te permitir mostrar un mensaje al usuario informando de que un problema ha ocurrido. La siguiente lnea de cdigo muestra un ejemplo de ello:

throw
Al igual como Java lanza excepciones es posible lanzarlas cuando se estime conveniente, utilizando la sentencia throws, el siguiente ejemplo lanza un error de tipo Exception si la cadena ingresada no tiene 3 caracteres.

11

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Fjese que la palabra reservada throws lanza un nuevo objeto proveniente de la clase Exception al cual se puede especificar mediante su constructor con parmetros un mensaje con la causa del error. El cdigo que invoca al mtodo lucir de la siguiente forma:

Para este caso la ltima excepcin mediante e.getMessage() mostrar el mensaje especificado al lanzar la excepcin codificada en nuestro mtodo, ya que, la excepcin ocurrida es recibida como parmetro (el objeto e) y getMessage() es un accesador que permite conocer el valor del mensaje. Para mayor informacin sobre los mtodos y constructores consulte la documentacin oficial de la clase Exception: http://download. oracle.com/javase/1.5.0/docs/api/java/lang/Exception.html

12

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Colaboracin entre clases.


Hasta ahora hemos trabajado con clases que manejan slo tipos de datos primitivos, sin embargo, los objetos pueden colaborar con otros objetos, esto permite mantener la encapsulacin y la reutilizacin de los objetos de forma independiente, por ejemplo, si pensamos en un curso, notaremos que est compuesto por al menos un profesor y una N cantidad de alumnos, por lo tanto si pensamos en registrar los datos del profesor, sera ineficiente decir que los atributos de la clase pudiesen ser el Rut del profesor, nombre o edad, debido a que ya estamos hablando de un grupo de atributos que en su conjunto representan un profesor, por otra parte es mucho ms entendible decir que la clase tiene un profesor que decir la clase tiene el Rut, nombre y edad del profesor, esta forma natural de ver las cosas se puede aplicar tambin en el software y tiene una lgica no muy difcil de comprender, por ejemplo si desesemos construir la clase llamada Curso, pero sabemos que el curso est compuesto de un profesor Qu debe existir primero? Es lgico que tengamos que comenzar con la clase profesor, dado que no puedo crear un curso y decir que contiene algo que no existe, vamos entonces a crear nuestra clase profesor:

13

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

La clase curso declara un objeto tipo profesor como un atributo de la clase. En el cdigo anterior la clase curso, contiene la definicin de un atributo de tipo Profesor, los objetos, al igual que los tipos de datos primitivos pueden ser recibidos y retornados como parmetros, esto permite que puedan ser utilizados en los comportamientos, permitiendo as su utilizacin en accesadores, mutadores y constructores. Agreguemos ahora el constructor con parmetros y sus respectivos mtodos get y set. Quedando el cdigo como muestra la imagen.

Observe que la clase curso utiliza su mtodo get y set para establecer u obtener el valor retornando y recibiendo un objeto de tipo Profesor completo, de esta forma es posible trasladar entre clases un conjunto de datos que representen una entidad. Veamos la utilizacin de la clase en el mtodo main().

14

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

En el cdigo que muestra la imagen anterior, se observa que en la primera lnea un objeto de tipo curso es instanciado, de forma adicional la instancia del objeto miCurso incluye la declaracin de un segundo objeto de tipo profesor, en la lnea que continua declaramos e instanciamos un objeto de tipo profesor utilizando su constructor con parmetros, luego, el objeto creado es pasado como parmetro hacia mi curso, el cual lo hace llegar a su atributo mediante el comportamiento setObjProfe. Observe que mediante la colaboracin es posible trabajar tanto con los datos del curso, como del profesor si la clase curso lo permite:

Adems observe que el mtodo getObjProfe() de la clase curso retorna un objeto de tipo profesor, esto significa que el comportamiento puede ser tratado como cualquier objeto de tipo profesor, ya que, las acciones que realicemos sobre l sern en realidad sobre el objeto que retorna. El siguiente ejemplo muestra como cambiar el Rut del profesor que se encuentra en el curso.

Nuestra clase curso, tiene 2 constructores, de los cuales slo el constructor con parmetros inicializa el valor del objeto profesor, en algunos casos hay que prestar cuidado al intentar llamar a los comportamientos de un objeto que no ha sido inicializado, debes recordar que el valor por defecto de un objeto no inicializado es null, esto significa que cualquier intento de utilizar un objeto que no existe lanzar una excepcin de tipo NullPointerException. El siguiente cdigo generar una exception de este tipo.

15

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Herencia
Una de las ms poderosas caractersticas de la OO es la herencia, presentando fundamentalmente una excelente forma de reutilizar cdigo, sin embargo la herencia va un paso ms lejos y aporta al usuario la posibilidad de crear relaciones entre clases, no slo con el fin de reutilizar cdigo, sino que mejorar de manera sustancial el diseo de un conjunto de clases, su organizacin, agrupacin y definicin de sus comportamientos. Es la capacidad que tiene las clases de heredar sus atributos, comportamientos hacia otras clases con el fin de que ellas puedan extender su funcionalidad. La herencia es muy beneficiosa cuando existe un conjunto de clases que contienen funcionalidades y atributos en comn, por ejemplo, si necesitramos definir dos clases, la primera para crear un objeto de tipo perro, del cual nos interesa su peso, edad, velocidad mxima al correr y el comportamiento ladrar y comer. Y la segunda, una clase que permita crear un objeto del tipo gato, del cual tambin se desea su peso, edad, cantidad de vidas restantes y sus comportamientos maullar y comer. Existe alguna similitud entre ambas clases? Por supuesto que s y esto se debe a que ambos son mamferos y comparten las propiedades edad, peso y el comportamiento comer. Una solucin basada en la herencia a este problema, consiste en agrupar en una clase todos aquellos elementos que ambos objetos tienen en comn, esto, con el fin de generar una nica vez los atributos peso, edad y toda la complejidad que pueda involucrar el comportamiento comer, posteriormente las clase gato y perro heredaran de la clase mamfero, haciendo que ambas posean el atributo edad, peso y el comportamiento comer sin necesidad de volver a codificarlos, de esta forma el gato solo tendr que definir en su propia clase lo que le falta o especializa.

La herencia al igual que la encapsulacin tambin contribuye a un mejor control y reduccin de errores, como muestra la imagen anterior, tanto el perro como el gato tienen edad, peso y comen, sin necesidad de redefinir dichos atributos y comportamientos en sus clases, debido a que ambos los poseen por conceptos de herencia desde la clase mamfero, entonces, si es necesario cambiar la forma en que ellos se alimentan, bastar con cambiar el mtodo comer una sola vez en la clase mamfero ya que dicho cambio afectar a ambas clases.

16

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Dentro de una jerarqua de clases, se denomina clase padre o sper clases a aquellas que heredan o entregan sus atributos y comportamientos hacia otras clases, por otra parte las clases que reciban atributos y comportamientos desde una clase padre se denominan clases hijas. Es importante tambin mencionar que una clase no necesariamente est obligada a heredar todos sus atributos y/o comportamientos. La siguiente imagen muestra una jerarqua de clases ms extensa como ejemplo, en el que las clases Gato y Perro, heredan los atributos edad y peso y el comportamiento de correr y comer desde las clases Terrestre, la que a su vez posee edad, peso y comer debido a que es una clase hija de Animal.

La herencia en programacin se comporta de igual forma que en la vida real, piensa en la relacin de una madre con su hijo, como todos sabemos, la madre va a heredar un conjunto de similitudes fsicas con su hijo, color de pelo, nariz, la forma de la boca y el color de ojos son algunos ejemplos, pero esto no ser todo, con el tiempo, vers que no slo las caractersticas fsicas sern heredadas, al tiempo notars que el hijo imita alguno de los comportamientos de la madre dado que muchas veces la similitud est en la forma en la que el hijo mira o acta, si bien el hijo acta de forma similar a la madre, vers que el hijo comenzar a modificar ciertos comportamientos (los especializa) y adems ir agregando unos nuevos, si lo llevamos al mundo de la programacin, notars que casi no hay diferencias, si creamos una clase llamada madre, nivel de felicidad ,el color de ojos y color de pelo seran sus atributos y comer, divertirse y respirar sus comportamientos, ahora supongamos que deseamos programar una clase llamada hijo, vers que al igual que una madre, los atributos y comportamientos entre ambos son muy similares, por lo que no tiene sentido realizar una copia de ellos en la clase hijo, a cambio, podemos agregar la herencia lo que da como resultado, que todos los atributos y comportamientos que la madre tenga, los tendr tambin el hijo, donde cada uno podr asignar valores y ejecutar comportamientos de forma independiente.

17

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

La sintaxis que permite agregar la herencia es la siguiente:

Mediante la palabra extends le decimos a Java que la clase Hijo hereda de la clase Madre, esto significa que en la clase Hijo todos los atributos y comportamientos de la clase Madre estarn disponibles en el hijo. En programacin a la clase madre se le conoce como sper clase y a las clases hijas como sub clases. Observa el siguiente cdigo:

Aqu se puede apreciar como mediante la palabra clave this en la clase hijo se puede utilizar el get del atributo color de pelo, a pesar de que este no est directamente declarado en la clase y pertenece ahora a ella debido a que es heredado de la clase Madre, mucha atencin con confundirse, si bien el atributo color de pelo, su get y set estn declarado en la clase Madre, los comportamientos por concepto de herencia son del hijo, creadas como variables de instancia en tiempo de ejecucin. Los atributos y comportamientos privados de la clase madre slo podrn ser llamados desde dentro de la misma, debido a que no son visibles desde las clases hijas.

18

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

A continuacin vamos a ver conceptos ms avanzados de la herencia mediante un ejemplo, observe el siguiente cdigo, el cual corresponde a una clase llamada Punto, la cual representa un punto en un plano de dos dimensiones

19

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

En captulos anteriores se recomend que todas las clases tuviesen su constructor por defecto o sin parmetros, en este caso en particular, dicho constructor ha sido omitido con el fin ejemplificar un error muy comn en la herencia que ser tratado ms adelante en este captulo. Mientras tanto prosigamos en como la clase es utilizada en el mtodo main.

Perfecto, hasta aqu tenemos una clase que nos permite crear un punto con sus respectivas coordenadas y que adems permite reiniciarlo, proceso que consisten en volverlo a dejarlo en la coordenada (0,0). Que sucede si agregamos una nueva funcionalidad, la cual consiste en la ubicacin de un punto en 3D, la pregunta que hay que realizar antes de comenzar a programar dicha clase, es: hay similitud entre un punto en 3D y uno en 2D? pues claro, nota que el punto en 3D tambin posee coordenadas en X e Y agregando slo la coordenada Z, adems el proceso de reiniciado, es muy similar, la diferencia est en que en punto 3D el mtodo es ms especializado dado que tambin debe llevar la coordenada Z a cero, o dicho de otra forma, hay parte de reiniciar en la clase punto que nos sirve en la clase Punto3D. Lo primero que debemos hacer entonces es implementar la herencia en la clase Punto3D, para ello escribimos lo siguiente:

20

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Con esta simple lnea de cdigo ya es posible en punto3D contar con toda la funcionalidad heredada desde la clase Punto, sin embargo nota que la lnea que implementa la herencia presenta un error, recuerdas que omitimos el constructor sin parmetros en la clase punto? Pues bien, esa es la razn del error que se nos presenta, este error est dado por lo siguiente; una clase hija que herede de una sper clase, de forma obligatoria necesita que exista la sper clase primero, as como el hijo, necesita que exista la madre, en este caso en particular nota que nuestra clase hija no tiene ningn constructor, esto implica que Java agregar el constructor por defecto a la clase, dada esta necesidad, cada vez que se aplica la herencia, una clase hija tratar mediante su constructor por defecto de llamar al constructor sin parmetros de su clase padre, mientras no se haga una llamada explicita a alguno de sus constructores, dada esta regla este problema tiene dos soluciones:

1. Realizar desde la clase hija la llamada a un constructor que exista en la clase padre

21

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

2. Crear explcitamente un constructor en la clase padre

Note que si no existe el constructor sin parmetro en la clase padre el cdigo generar un error ya que si bien el constructor es codificado en la clase hija, no existe una llamada explicita al constructor de la clase padre, por ende esto tambin asume la llamada al constructor sin parmetro de la misma.

La palabra reservada super permite a una clase hacer referencia a un miembro de su clase padre, cuando super va a acompaado de parntesis como se utiliz en el ejemplo anterior hace referencia al constructor de la clase padre (recuerde que slo un constructor puede invocar a otro), o tambin puede utilizarse para realizar la llamada a algn atributo o comportamiento utilizando el operador . ms el nombre del miembro que se desea llamar.

22

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Comencemos a generar los miembros que se necesitan en la clase 3D, comenzaremos por definir su atributo y luego, accesadores, mutadores y constructores:

En el cdigo anterior existen 3 puntos importantes que hay que destacar, el primero, corresponde a la declaracin del atributo Z, ya que X e Y ya estn declaradas debido a que la clase extiende de la clase Punto.

Lo segundo es referente a la lnea que se encuentra comentada dentro del constructor por defecto, esta lnea se encuentra comentada dado que es opcional, tu puedes escoger entre realizar la llamada de forma explcita o no, sin embargo, para cualquiera de los dos casos el constructor sin parmetros es llamado siempre y cuando no se realice una llamada explicita a algn constructor con parmetros.

El tercer punto importante se encuentra en el constructor con parmetros, nota que recibe tres parmetros, los cuales corresponden a cada una de las coordenadas, lo interesante est en la reutilizacin del constructor de la clase padre para asignar los valores a X e Y, y luego se asigna el valor de Z, tenga en consideracin la utilizacin de super cuando invoca un constructor siempre debe ser la primera lnea de cdigo del mtodo.

23

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Veamos ahora como luce la utilizacin de nuestra clase en el mtodo main:

En el mtodo main, se puede ver como un punto 3D es creado utilizando su constructor, adems note que luego los comportamientos getX, getY y getZ son impresos, dando como resultado los valores 4, 6, 8 como muestra de que sus valores fueron asignados de forma correcta, adems nota que getX y getY son llamados del objeto p1 de tipo Punto3D, el cual los contiene por conceptos de herencia.

Sin embargo el problema se suscita en la impresin que viene luego de reiniciar, dando como resultado 0, 0, 8, esto ocurre ya que el comportamiento heredado no siempre se ajusta a las necesidades de la clase hija, presentando en este caso la limitante de que Z no es llevado a cero.

24

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Sobre escritura
Este pequeo inconveniente puede solucionarse agregando al cdigo una sobre escritura del mtodo reiniciar en la clase Punto3D como muestra la siguiente imagen.

Como puedes ver, el comportamiento ha sido definido otra vez en la clase Punto3D, la anotacin @override especifica que este mtodo tambin existe en el padre, esta sobre escritura permite que cuando se llame el comportamiento reiniciar() de un objeto de tipo Punto3D sea este mtodo el que se ejecute, ocultando as el del padre, para este caso en particular, parte de lo que hace la clase padre era til para este caso y por ello se utiliza super para ejecutar primero el reiniciar del padre, es importante destacar, que en un mtodo sobre escrito no es obligacin llamar al mtodo que sobre escribe. Si volvemos a ejecutar el siguiente cdigo:

25

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

El resultado ser (0, 0, 0), lo que significa que la sobre escritura ha funcionado. Recuerda que la herencia puede tener todo los niveles que se desee, por ejemplo, si creamos una clase que herede de Punto3D y en ella agregamos una nueva coordenada, tendramos un objeto que permitiese especificar 4 coordenadas. Los comportamientos como getX y getY se encontraran disponibles en dicha clase dado que la clase Punto se los hereda a Punto3D y Punto3D le heredar todo lo del Punto en 2D ms todo lo implementado en la clase 3D hacia nuestra nueva clase, sin embargo, el comportamiento reiniciar original de la clase Punto, no podr utilizarse en la nueva clase ya que Punto3D lo ha ocultado, siendo el comportamiento de esta clase el heredado hacia su clase hija.

final
La palabra clave final, es asociada a cuando una variable o mtodo ha llegado a su forma final, es decir ya no puede cambiar, por ejemplo, si vamos a nuestra clase 3D otra vez y declaramos la variable z de tipo final, el cdigo lucir de la siguiente forma:

26

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Los errores que aparecen tienen relacin al cambio que se ha realizado en z, dado que la variable ahora es de tipo final, esto significa no debe haber ninguna combinacin posible que permita que cuando se instancie la clase la variable quede sin valor, por ello, el constructor sin parmetro est marcado con errores, la nica solucin posible es dar un valor por defecto a z como se indica en la lnea comentada, en el constructor con parmetros, la llamada al set de Z no es posible de utilizar, ya que Java al no conocer que suceder en dicho mtodo asume que podra quedar sin un valor, por ello nos obliga a asignarla de forma directa, por ltimo, el set debe ser eliminado, ya que carece de sentido, debido a que la variable una vez asignada no puede cambiar su valor. La palabra reservada final tambin puede ser utilizada en un comportamiento, si se hace, dicho comportamiento no podr ser sobre escrito, el siguiente ejemplo muestra como al definir el comportamiento reiniciar como final en la clase Punto la clase Punto3D queda sin posibilidad de realizar la sobre escritura:

27

Taller de programacin I

Semana IV - Herencia, Polimorfismo e Interfaz

Resumen de la Semana
Esta semana aprendiste a trabajar con las clases de entrada y salida de datos, creaste una clase que permite leer desde el teclado y trabajaste en profundidad en los conceptos de captura y gestin de las excepciones. Analizaste conceptos de colaboracin entre clases y de herencia.

Sinopsis de la prxima clase


La prxima semana comenzars a trabajar con el diseo de interfaces grficas utilizando Swing.

28

You might also like