Contenidos que trataremos en la UD4
Antes de subir los apuntes, debemos saber qué estamos aprendiendo y qué habremos demostrado saber cuando hayamos aprobado la evaluación. Entre corchetes pongo las estructuras del lenguaje que hemos visto y que trabajan estos conceptos:
Criterios aprendizaje
CA3.4 Escribiuse código utilizando control de excepcións. [try…catch]
CA4.1 Recoñeceuse a sintaxe, a estrutura e os compoñentes típicos dunha clase.
CA4.2 Definíronse clases.
CA4.3 Definíronse propiedades e métodos.
CA4.4 Definíronse construtores.
CA4.5 Desenvolvéronse programas que instancien e utilicen obxectos das clases creadas anteriormente.
CA4.6 Utilizáronse mecanismos para controlar a visibilidade das clases e dos seus membros. [public, private, protected, default]
CA4.7 Definíronse e utilizáronse clases herdadas. [implements y extends.]
CA4.8 Definíronse e utilizáronse métodos estáticos. [Static].
CA4.9 Definíronse e utilizáronse interfaces. [Interface.]
CA4.10 Definíronse e utilizáronse conxuntos e librarías de clases. [Import]
CA7.1 Identificáronse os conceptos de herdanza, superclase e subclase.
CA7.2 Utilizáronse modificadores para bloquear e forzar a herdanza de clases e métodos. [Final, abstract.]
CA7.3 Recoñeceuse a incidencia dos construtores na herdanza. [Super].
CA7.4 Creáronse clases herdadas que sobrescriban a implementación de métodos da superclase.
CA7.5 Deseñáronse e aplicáronse xerarquías de clases.
CA7.6 Probáronse e depuráronse as xerarquías de clases.
CA7.7 Realizáronse programas que implementen e utilicen xerarquías de clases.
CA7.8 Comentouse e documentado o código.
Estamos trabajando una de las unidades más completa ya que casi trabajaremos todas las funcionalidades asociadas con el manejo de clases. Estos criterios están todos en el documento que la Xunta genera para explicar qué se debe aprender en cada módulo (asignatura).
Apuntes
Además de las transparencias que tenéis en el aula virtual, también podéis utilizar estas hojas que os servirán de cheat Sheet para recordar rápidamente qué hace cada palabra reservada:
Resumen en una línea:
Static: Elemento de clase. No se copia a los objetos (instancias).
- Método static: Método de clase. No se copia los objetos. Sólo puede usar variables locales y atributos static.
- Atributo static: Atributos de clase. Si se cambia, se cambia para todos. Ejemplo: precio billete del autobús urbano.
Final: Significa «no lo toques«.
- Clase Final: Clase que no permite herencia.
- Método Final: Método que no permite ser sobreescrito en los descendientes.
- Atributo Final: Constante. Sólo se puede establecer el valor en la declaración o en los constructores.
Abstract: No es usable. Hay que implementarlo en las subclases. «Rapaz, faino ti«.
- Clase abstract: Una clase de la que no se pueden construir objetos. Debemos crear clases heredadas que serán las que podremos instanciar. Pueden tener métodos abstractos. Ejemplo: Multimedia m = new Pelicula();
- Método abstract: Es un método que no está implementado. Obliga a las subclases a implementar dicho método. Es un método del que solo se escribe su nombre, parámetros y tipo devuelto pero no su código. Una clase con un método abstracto, será obligatoriamente abstracta. Una clase abstracta con todos sus métodos abstractos será una clase abstracta pura.
Interface: Una interface es una clase java que no implementa ningún método. Lo único que hace es decir qué métodos deben implementar las clases que la implementen. Para implementar una interfaz se usa la palabra reservada implements. Podemos decir que una interface es una clase abstracta pura sin atributos. Usualmente se usa en uno de estos dos casos:
- «Simular» la herencia múltiple evitando el problema del diamante.
- Asegurar que podemos crear clases que implementen las mismas funcionalidades de forma «libre». Por ejemplo, si queremos implementar un sistema de mensajería que haga llegar un texto a un usuario determinado, podemos crear una interfaz iMensajería que tenga el método entregarMensaje(Persona p, String mensaje). Una clase EnvioMails entregará el texto usando internet, cogiendo de la Persona p su atributo email y enviando el texto. Una clase EnvioTelegram que implemente la interfaz, cogerá el móvil del objeto Persona p, y creará un mensaje de telegram con el texto que enviará por Telegram. Usamos una interfaz porque apenas hay nada común en ambos procesos, sólo el hecho de lo qué queremos hacer.
Cast: Se utiliza para convertir un tipo de datos en otro compatible. El ejemplo típico es la conversión entre tipos que manejan números enteros: short (16b), int(32b), long(64b) y coma flotante float (32b), double (64b).
- Si la conversión se hace de un tipo pequeño a un tipo más grande no necesitaremos hacer nada. Será un cast implícito.
- Si se hace de un tipo grande a un pequeño, debemos «obligar» a java a que haga la conversión. Para ello ponemos el tipo de dato a convertir entre paréntesis. int n = ((int) datoLong) – 1;
Con objetos, el cast implícito se hace al usar una subclase como superclase. El cast explícito se hace al convertir una superclase a subclase. En este caso debemos estar seguros de que el objeto es de la clase a la que vamos a convertir ya que si no tendremos una excepción.
Vídeo explicativo (ver éste y los tres siguientes).
Manejos de excepciones
En Java, los errores en tiempo de ejecución se denominan excepciones. Un caso típico de error en tiempo de ejecución es intentar dividir un número entre cero. Si tenemos este código:

El compilador lo compilará porque la sentencia parece válida. Pero, ¿qué pasa si una vez ejecutamos el programa b es igual a 0? No es posible dividir un número entre 0 por lo que tenemos un error en tiempo de ejecución. Estos errores en Java se manejan con Excepciones. El programa lanzará una Excepción (en este caso una Exception de la subclase ArithmeticException) y se dejarán de ejecutar las instrucciones siguientes. Para evitar que se dé una excepción podemos comprobar que b != 0 o podemos meter la sentencia dentro de un bloque try{ } catch.

¿Cómo funcionaría esto?
- Si b tiene un valor distinto de cero, se ejecutará la división de la línea 19 y luego se ejecuta la línea 20 mostrando por pantalla el texto «El resultado es <resultado>». La línea 23 no se ejecutará.
- Si b == 0. Se intenta ejecutar la línea 19 y el sistema tendrá un error en tiempo de ejecución lanzando una ArithmeticException. En este caso la línea 20 no se ejecutará y se pasará a ejecutar lo contenido en el catch. Es decir se ejecutará la línea 23 mostrando por pantalla el texto: «No se puede dividir entre cero».