Sei sulla pagina 1di 34

Programación Orientada a Objetos

01/06/2019
Cristina Otero Rodríguez

1. Tipos primitivos
Enteros:

 Byte: 1 byte. Desde -128 hasta 127.


 Short: 2 bytes. Desde -32,768 hasta 32,767.
 Int: 4 bytes de almacenamiento.
 Long: 8 bytes. Hay que añadir el sufijo “L”.

Decimales:

 Float: 4 bytes de almacenamiento. Aproximadamente de 6 a 7 cifras decimales. Hay que añadir el sufijo “F”.
 Double: 8 bytes. Aproximadamente 15 cifras decimales.

Char: para representar caracteres.

Boolean: true/false.

Enumerados: se definen mediante la palabra reservada enum.

Figura 1.1 Definición de un enumerado

Refundición (cast): consiste en convertir un tipo de dato en otro.

Figura 1.2 Ejemplo de refundición

2. Variables y constantes en Java


Variables:

 Hay que especificar el tipo de dato que almacenará en su interior y el nombre de la variable.
 No se pueden utilizar variables que no se hayan iniciado.
 Las variables se pueden declarar e iniciar en la misma línea.

Constantes:

 Una constante no puede cambiar de valor durante la ejecución del programa.


 Se crean utilizando la palabra clave final, especificando el tipo de dato y su valor.
 Hay constantes de clase. Son aquellas que se definen como final y estáticas (final static
nombre_constante). Por ejemplo el número pi en la clase Math.
Página 1 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Instrucciones de asignación: se emplean como medio de almacenar un valor en una variable. Funcionan tomando
el valor que aparece en el lado derecho del operador y copiando dicho valor en la variable especificada en el lado
izquierdo:

Figura 2.1 Ejemplo de asignación

El lado derecho de la asignación se denomina expresión. El tipo de expresión del lado derecho debe corresponderse
con el tipo de la variable a la que se asigna.

Expresión: son elementos que calculan un valor.

Bloque: conjunto de declaraciones e instrucciones situado entre una pareja de llaves. Un bloque también se
denomina ámbito. BlueJ representa los distintos ámbitos con colores diferentes, lo que se denomina representación
visual del ámbito.

Sobrecarga de nombres: situación en la que se utiliza el mismo nombre para dos entidades diferentes.

3. Operadores
Aritméticos Lógicos, relacionales y booleanos
+ suma > mayor que
- resta < menor que
* multiplicación <> mayor o menor que
/ división != distinto que
++ incrementa el valor de la variable en una unidad == igual que
-- reduce el valor de la variable en una unidad && y
+=n incrementa el valor de la variable en n unidades || o
-=n reduce el valor de la variable en n unidades ? seleccionar uno de dos valores alternativos en una condición
% (módulo) calcula el resto de una división entera

EXAMEN: para evaluar que la suma (o la resta) de dos números (uno entero y uno decimal) verifican una condición, el
resultado de dicha operación es un número decimal. Por ejemplo el siguiente fragmento de código imprimiría dos
veces la palabra true.

Figura 3.1 Ejemplo de evaluación de operaciones matemáticas

Sin embargo, para almacenar en una variable entera la suma de un número entero y un decimal, es necesario
castear (refundir) la variable que contiene el valor decimal. En el caso de almacenar dicha suma en una variable
decimal, no es necesario la conversión del entero a decimal.

Página 2 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

4. Clases en Java
Clase: se utilizan para describir, de manera abstracta, todos los objetos de un tipo concreto. En cada clase se
definen los campos y métodos. Por tanto, todos los objetos de una misma clase compartirán los métodos y campos.
Las clases definen tipos.

Cada clase tiene un código fuente asociado en el que se definen los detalles de la clase: los campos y métodos que
tiene una clase y lo que sucede cuando se invoca cada método.

En Java hay tres tipos de clases:

1. Propias: elaboradas por el programador.


2. Predefinidas: están ya construidas dentro del lenguaje. Por ejemplo:
 Math: colección de métodos para realizar cálculos matemáticos.
 String: sirve para manejar cadenas de texto.
 Array: permite manipular colecciones.
 Thread: permite la programación concurrente.
3. Terceras fuentes: son librerías hechas por programadores individuales y puestas a disposición de otras
personas.

En API Java se incluyen todas las clases predefinidas.

Clases genéricas: no tienen un tipo concreto por lo que es necesario parametrizarlas con un segundo tipo. Por
ejemplo la clase ArrayList.

Clases envolventes (wrappers): los tipos sencillos (int, boolean, char) no pueden añadirse en una colección.
Cuando se necesita crear una lista, se hace a través de una clase envolvente.

Autoboxing: se realiza automáticamente cuando se utiliza un valor de tipo primitivo en un contexto que necesita una
clase envolvente. La operación inversa es el unboxing. Se aplica siempre que se transfiera un valor de tipo primitivo
como un parámetro a un método que espera un tipo envolvente, y cuando se almacena un valor de tipo primitivo en
una variable de tipo envolvente. El unboxing se aplica cuando se pasa un valor de tipo envolvente como parámetro a
un método que espera un valor de tipo primitivo, y cuando se almacena en una variable de tipo primitivo.

Interfaz de una clase: documentación que incluye:

 Nombre de la clase.
 Descripción general del propósito de la clase.
 Lista de constructores y métodos.
 Parámetros y tipos de retorno para cada constructor y método.
 Descripción del propósito de cada constructor y método.
 No incluye el código fuente que implementa la clase.

La interfaz de una clase es el conjunto de detalles que necesita ver cualquier otro programador que la use.
Proporciona información acerca de cómo utilizar la clase. Incluye las signaturas de los constructores y los métodos,
además de una serie de comentarios. Es la parte pública de una clase. Su propósito es definir lo que hace la clase.

Un comentario dentro del código fuente es añadido al javadoc cuando comienza por “ /** ”:

Figura 4.1 Ejemplo de comentario que se añadirá a la documentación de la clase


Página 3 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Implementación: código fuente completo que define cómo funciona una clase. Los cuerpos de los métodos y la
mayoría de los campos son parte de la implementación. También se denomina parte privada de una clase. El usuario
de una clase no necesita conocer su implementación.

Ocultamiento de la información: principio que establece que los detalles internos de la implementación de una
clase deben estar ocultos a los ojos de otras clases. Garantiza una mejor modularización de las aplicaciones.

Colección (abstracción colección): concepto de agrupar cosas para referirse a ellas y manejarlas de manera
conjunta.

Matrices: colección de tamaño fijo. Las ventajas de estas clases frente a las clases de colección de tamaño flexible
son:

 El acceso a los elementos almacenados en una matriz suele ser más eficiente que el acceso a los elementos
de una colección de tamaño flexible comparable.
 Las matrices pueden almacenar tanto objetos como valores de tipo primitivo.

Se declaran siguiendo este patrón:

Figura 4.2 Declaración de una matriz

La forma general de construcción de un objeto matriz es:

Figura 4.3 Construcción de un objeto matriz

También se pueden construir matrices de estas dos maneras:

Figura 4.4 Construcción de un objeto matriz

Las matrices se inicializan de la siguiente forma:

 Matriz de objetos (también String): todas las posiciones se inician con valor null.
 Matriz de números: se inician las posiciones con valor 0.
 Matriz de boolean: las posiciones se inician a false.
 Matriz de caracteres: carácter nulo (su código Unicode es \u0000).

Para conocer el tamaño de una matriz, se recurre a la siguiente sentencia:

Ilustración 4.1Creación y determinación del número de elementos de una matriz

Página 4 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

4.1. Propiedades de las clases

Está formada por una parte externa (cabecera y comentario) y una parte interna (campos, constructores y
métodos).

Cabecera: el propósito principal es proporcionar a la clase un nombre. Por convenio, los nombres de las clases
comienzan siempre por letra mayúscula. Sobre la cabecera de la clase suele incluirse un comentario en el que se
describe brevemente la clase.

Campos: almacenan datos de manera persistente dentro de un objeto. También se denominan variables de
instancia. Se pueden consultar desde el inspector. La definición de los campos se realiza de la siguiente forma:

Figura 4.5 Ejemplo de campos dentro de una clase

Una de las funciones más importantes de un campo es recordar la información externa pasada al objeto, con el fin de
que esa información esté disponible para el objeto a lo largo de toda su vida. Los campos proporcionan, por tanto, un
lugar donde almacenar datos de larga duración. Además, son accesibles para todos los métodos del objeto.

Las clases también pueden tener campos denominados variables de clase o variables estáticas. De cada variable
de clase existirá en todo momento exactamente una copia, con independencia del número de instancias que se creen
de dicha clase.

EXAMEN: que una variable sea estática implica que cualquier objeto de esa clase puede modificar su valor.

EXAMEN: un campo estático que sea un “número” se inicializa en 0. Si es un boolean se inicializa en false y si es un
String en null.

El ámbito de un campo es todo el conjunto de la definición de la clase: puede accederse a él desde cualquier punto
de la misma.

El tiempo de vida de un campo coincide con el del objeto al que pertenece.

Es recomendable que los nombres de los campos proporcionen información acerca de la información que se
almacena en ellos.

Los campos se definen como private para evitar que se pueda acceder directamente a él desde cualquier otro punto
situado fuera de la clase en la que está definido. Por lo que, para modificar o acceder a su información, deberán
definirse métodos (setters y getters).

Página 5 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Un campo es inmutable cuando su valor no puede modificarse después de haberlo inicializado (una vez instanciado
el objeto).

Constructores: garantizan que un objeto se configure apropiadamente en el momento de crearlo por primera vez.

Métodos: implementan el comportamiento de un objeto; proporcionan su funcionalidad.

Es recomendable definir campos, constructores y métodos en ese orden.

Cabecera

Campos

Constructor

Métodos

Figura 4.6 Estructura de una clase

Página 6 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

4.2. Diagrama de clases

Diagrama de clases: muestra las clases de una aplicación y las relaciones entre ellas. Proporciona información
acerca del código fuente y presenta una vista estática de un programa.

Figura 4.7 Diagrama de clases

El diagrama de clases cambia cuando se modifica el código fuente bien sea modificando las relaciones entre clases o
creado o borrando clases.

4.3. Clases predefinidas

Las clases predefinidas están organizadas por paquetes (carpetas), aquí algunos ejemplos:

1. Java
a. java.awt
b. java.util
c. java.io
d. java.nio
2. Javax
a. javax.activity
b. javax.annotation

Los paquetes permiten organizar las clases, evitar conflictos de nombres (no puede haber dos clases con el mismo
nombre en el mismo paquete) y controlar la visibilidad de las clases.

El paquete java.lang es un paquete por defecto. Si se quiere utilizar otro paquete, hay que añadir la palabra clave
import, el nombre del paquete y “*”.

Figura 4.8 Importación de un paquete


Página 7 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

También se puede importar solamente una clase del paquete:

Figura 4.9 Importación de una clase

Las instrucciones de importación deben colocarse siempre antes de las instrucciones de clases en un archivo.

La máquina virtual de Java (JRE) se actualiza incluyendo nuevas clases predefinidas.

Algunas de las clases predefinidas más destacadas se muestran a continuación, con los métodos más utilizados:

System:

 System.out.print(): imprime por pantalla.


 System.out.println(): imprime por pantalla y salta de línea.
 System.out.printf(): imprime por pantalla y da formato (número de decimales, espacio que ocupa el número,
etc.).

Math:

 Math.sqrt(n): raíz cuadrada de un número.


 Math.pow(base, exponente): potencia de un número.
 Math.sin(ángulo), Math.cos(ángulo), Math.tan(ángulo): seno, coseno y tangente de un ángulo.
 Math.atan(tangente): obtener el ángulo a partir de la tangente.
 Math.round(decimal): redondear un número.
 Math.PI: constante de clase con el número π.

String:

 String no es un tipo primitivo, es una clase predefinida.


 String mi_nombre=”Juan”; donde mi_nombre es un objeto (instancia o ejemplar) de la clase String.
 length(): devuelve la longitud de una cadena de caracteres.
 charAt(n): devuelve la posición de un carácter dentro de una cadena. Las posiciones empiezan a contar
desde cero.
 substring(x,y): devuelve una subcadena dentro de la cadena, siendo x el carácter a partir del cual se extrae e
y el número de caracteres que se quieren extraer.
 equals(cadena): devuelve true si dos cadenas que se comparan son iguales y false si no lo son. Distingue
mayúsculas y minúsculas.
 equalsIgnoreCase(cadena): devuelve true si dos cadenas que se comparan son iguales y false si no lo son.
No distingue mayúsculas y minúsculas.

Página 8 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

 split(“expresion“): puede dividir una cadena en una serie de subcadenas separadas y devolverlas en una
matriz de cadenas.
 trim(): elimina los espacios al principio y final de una cadena.
 toLowerCase(): pasa la cadena a minúsculas.
 toUpperCase(): pasa la cadena a mayúsculas.

EXAMEN: los métodos que “modifican” una cadena realmente no actúan sobre la propia cadena sino que retornan otra
cadena con los cambios aplicados.

EXAMEN: las cadenas deben compararse siempre con el método equals.

Scanner:

 nextLine(): permite introducir texto.


 nextInt(): entrada de enteros.
 nextDouble(): permite introducir números decimales.

Figura 4.10 Ejemplo de utilización de la clase Scanner

JOptionPane:

 Se puede construir una ventana en la que se solicita la información al usuario.

Figura 4.11 Ejemplo de utilización de la clase JOptionPane

 showInputDialog(cadena): se utiliza este método estático. Este método devuelve un String.

Integer:

 Clase envolvente del tipo sencillo int.


 parseInt(string): se utiliza para transformar un String en int. Es un método estático por lo que hay que indicar
la clase antes del método (Integer.parseInt()).

Double:

 parseDouble(string): se utiliza para transformar un String en double.

Página 9 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

NumberFormat:

 Esta clase se utiliza para dar formato a los números (más o menos decimales, etc.).

ArrayList:

 Está incluida en el paquete java.util.


 Un objeto de esta clase se define como:

 Las instancias se pueden crear utilizando la notación diamante:

 add(objeto): añade un objeto a la colección.


 size(): proporciona el número de elementos almacenados en la lista.
 get(índice): devuelve el elemento almacenado en la posición índice.
 remove(índice): borra el elemento almacenado en la posición índice y reorganiza la lista.
 iterator(): devuelve un objeto de la clase Iterator que incluye todos los elementos del ArrayList.
 Esta clase es capaz de incrementar su capacidad interna según sea necesario (cada vez que se añade un
nuevo elemento).
 Mantiene su propio contador privado, el número de elementos que almacena en cada instante.
 Mantiene el orden de los elementos que se inserten en la lista. Cada vez que se añade un nuevo elemento,
este se almacena al final de la lista.
 Se puede almacenar el mismo objeto varias veces, es decir, no tiene en cuenta la duplicidad de objetos.
 Los elementos almacenados tienen una numeración o posicionamiento implícito que comienza en 0. La
posición de un objeto dentro de una colección se denomina índice.

EXAMEN: un ArrayList se puede inicializar asignando un número concreto de elementos. De esta forma, se mejora la
eficiencia pero no se restringe la capacidad de la estructura.

Iterator:

 Está incluida en el paquete java.util.


 La clase ArrayList devuelve un objeto de tipo Iterator al invocar a su método iterator.
 La forma en que se utiliza un Iterator es la siguiente

Figura 4.12 Ejemplo de utilización de un Iterator

 hasNext(): comprueba si hay más elementos.


 next(): obtiene el siguiente elemento.
 remove(): permite eliminar elementos cuando se está buscando dentro de una colección.
Página 10 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Random:

 Está incluida en el paquete java.util.


 Se utiliza para generar números aleatorios (realmente son números pseudoaleatorios). Para crear un número
aleatorio hay que:
1. Crear una instancia de la clase Random.
2. Hacer una llamada a un método de dicha instancia para obtener el número.
 nextInt(): devuelve un número aleatorio de tipo entero.
 nextInt(bound): devuelve un número aleatorio de tipo entero mayor que 0 y menor que el límite introducido
(bound).

HashMap:

 Está incluida en el paquete java.util.


 Un mapa es una colección de parejas clave/valor de objetos. Se utilizan para realizar búsquedas en una sola
dirección, en las que se conoce la clave de búsqueda y se necesita conocer el valor asociado a esa clave.
 Un objeto de esta clase se define como:

 Las instancias se pueden crear utilizando la notación diamante:

 put(clave, valor): inserta una entrada en el mapa.


 get(object): extrae el valor correspondiente a una clave especificada.
 size(): proporciona el número de elementos almacenados en el mapa.
 getOrDefault(clave, valor): si la clave está en uso en el mapa, el método devuelve su valor asociado. Si la
clave no está devuelve el valor por omisión.

HashSet:

 Está incluida en el paquete java.util.


 Un conjunto es una colección que almacena cada elemento individual como máximo una vez. No mantiene
ningún orden específico.
 Un objeto de esta clase se define como:

 Las instancias se pueden crear utilizando la notación diamante:

 add(object): inserta una entrada en el conjunto.


 get(object): extrae el valor correspondiente a una clave especificada.
 size(): proporciona el número de elementos almacenados en el mapa.

Página 11 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Set:

 Está incluida en el paquete java.util.


 Un objeto de esta clase se define como:

 Las instancias se pueden crear utilizando la notación diamante:

 add(object): inserta una entrada en el conjunto.


 size(): proporciona el número de elementos almacenados en el mapa.

Object:

 Es una clase de la librería estándar Java que sirve como superclase para todos los objetos.
 Disponer de una superclase común para todos los objetos persigue dos objetivos:
 Declarar variables polimórficas de tipo Object capaces de almacenar cualquier tipo de objeto.
 Puede definir algunos métodos que luego estén disponibles automáticamente para todos los objetos
existentes.
 equals(): comprueba si existe una igualdad de referencias. Si se quiere evaluar la igualdad de contenidos
entre dos objetos de una determinada clase, hay que sustituir este método dentro de dicha clase.
 hashCode(): devuelve un código hash para el objeto.
 toString(): crea una representación de un objeto en forma de cadena de caracteres.
 getClass(): devuelve la instancia de Class asociada con un objeto.

Objects:

 Está incluida en el paquete java.util.


 requireNonNull(objeto, mensaje): genera un NullPointerException, con la cadena asociada, si el valor del
objeto es null. En caso contrario no hará nada.

Class:

 Es una clase genérica: tiene un parámetro tipo que especifica el subtipo de clase concreto al que hace
referencia.
 Los objetos de esta son útiles si se quiere saber si el tipo de dos objetos coincide.

FileReader:

 Está incluida en el paquete java.io.

BuferedReader:

 Está incluida en el paquete java.io.

Path:

 Está incluida en el paquete java.nio.


 Es una interfaz.
 La lectura de un archivo de texto se realiza de la siguiente forma

Página 12 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Figura 4.13 Lectura de un archivo de texto

FileWriter:

 Está incluida en el paquete java.io.


 Permite escribir un archivo de texto, siguiendo este patrón:

Figura 4.14 Escritura de un archivo de texto

File:

 Está incluida en el paquete java.io.


 Permite a un programa consultar los detalles relativos a un archivo externo, de una forma independiente del
sistema de archivos concreto sobre el que se esté ejecutando el programa.

 Crear un objeto File dentro de un programa no crea un archivo dentro del sistema de archivos. Realmente
almacena los detalles acerca de un archivo dentro del objeto.

Files:

 Está incluida en el paquete java.nio.

Serialización de objetos: permite leer y escribir en una única operación objetos completos, así como jerarquías de
objetos. Todos los objetos implicados deben pertenecer a alguna clase que implemente la interfaz Serializable.

4.4. Herencia

Herencia: permite definir una clase como ampliación de otra.

Herencia múltiple: se produce cuando una clase hereda de más de una superclase. Java no permite la herencia de
múltiples superclases pero proporciona otra estructura, interface, que permite una forma limitada de herencia
múltiple.

Página 13 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

EXAMEN: las clases extienden a otras clases e implementan interfaces. Las interfaces también extienden a otras
interfaces, pero no pueden heredar de otras clases.

Clase padre o superclase: clase que es ampliada por otra clase.

Clase hija o subclase: clase que amplía (hereda de) otra clase. La subclase hereda todos los campos y métodos de
su superclase. Una subclase es una especialización de una superclase.

Figura 4.15 Definición de una clase hija

EXAMEN: no se puede referenciar a una clase padre con un tipo de sus subclases. Por ejemplo, la tercera línea del
siguiente fragmento no es correcta:

Sin embargo, sí se puede asignar a una clase padre un objeto de sus subclases:

EXAMEN: entre dos clases hijas no hay relación de herencia, por tanto, no se puede hacer referencia entre ellas.

EXAMEN: el siguiente fragmento lanza un error, ClassCastException, en tiempo de ejecución porque el tipo dinámico
de b es padre y no puede ser casteado (refundido) a la clase hija. Durante la compilación no habrá un error porque el
tipo estático de b y s tienen una relación de herencia.

Figura 4.16 Ejemplo del uso del polimorfismo

Clases abstractas: son clases que no están pensadas para crear objetos sino solo para servir como superclases.
Pueden contener métodos abstractos (no es obligatorio que los contengan). Se utilizan para lograr los siguientes
objetivos:

1. No crear instancias de la clase abstracta (se producirá un error de compilación).


2. Solo las clases abstractas pueden disponer de métodos abstractos. De esta forma se garantiza que todos los
métodos de las clases concretas puedan ejecutarse.
3. Las clases abstractas con métodos abstractos obligan a las subclases a sustituir e implementar esos
métodos declarados como abstractos. Si una subclase no proporciona una implementación para un método
abstracto heredado, será abstracta ella misma, y no podrá crear ninguna instancia.

Clases concretas: todas las clases que no son abstractas.

Página 14 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Subclase abstracta: para que una subclase de una clase abstracta se transforme en concreta, debe proporcionar
implementaciones para todos los métodos abstractos heredados. En caso contrario, la propia subclase será también
abstracta.

Interface: es una especificación de un tipo (en la forma de un nombre de tipo y conjunto de métodos) que no define
ninguna implementación para los métodos. Sus características son las siguientes:

1. Se utiliza la palabra clave interface en lugar de class en la cabecera de la declaración.


2. No contienen constructores.
3. No contienen campos de instancia.
4. Solo se permite definir campos de clase constantes (static y final) con visibilidad public. Las palabras clave
public, static y final pueden omitirse; se dan por hechas de forma automática.
5. Los métodos abstractos no tienen que incluir la palabra abstract en su cabecera.
6. En Java 8 pueden incluirse métodos marcados con las palabras default y static que incluyen cuerpo de
método.

Figura 4.17 Ejemplo de interfaz

Herencia de una interfaz: una clase puede heredar de una interfaz de manera similar a como se hereda de una
clase. Se utiliza la palabra clave implements.

Figura 4.18 Declaración de una clase que hereda de una interfaz, de una clase abstracta que implementa una interfaz y de
una subclase que también implementa una interfaz

Jerarquía de herencia: conjunto de clases que están vinculadas por relaciones de herencia.

Figura 4.19 Ejemplo de una jerarquía de herencia

Página 15 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Constructor de la superclase: el constructor de una subclase debe siempre invocar al constructor de una
superclase como primera instrucción. Si el código fuente no incluye esta llamada, Java intentará insertar una llamada
automáticamente. La inserción automática de esta llamada solo funciona si la superclase dispone de un constructor
sin parámetros. Si no es así, se informará de que se ha producido un error.

Figura 4.20 Ejemplo de constructor de una subclase llamado al constructor de la superclase

Ventajas de la herencia:

 Se evita la duplicación de código.


 Reutilización del código.
 Se facilita el mantenimiento.
 Capacidad de ampliación.

Subtipo: de forma análoga a la jerarquía de clases, los tipos forman una jerarquía de tipos. El tipo especificado por la
definición de una subclase es un subtipo del tipo correspondiente a su superclase.

Sustitución: implica que pueden utilizarse objetos de un subtipo en cualquier lugar en el que lo que se espere sean
objetos de un supertipo.

Variable polimórfica: puede almacenar objetos de diferentes tipos (en concreto, del tipo declarado o de cualquier
subtipo del tipo declarado).

Cast: está compuesto por el nombre de un tipo escrito entere paréntesis delante de una variable o una expresión. El
casting deberá evitarse siempre que sea posible, porque puede conducir a errores en tiempo de ejecución.

Tipos estáticos: es el tipo tal como está en el código fuente, en la instrucción de declaración de la variable.

Tipos dinámicos: es el tipo del objeto que está almacenado actualmente en la variable.

Sustitución de métodos: una subclase puede sustituir la implementación de un método (no se puede modificar el
tipo de retorno del método en la subclase). Para ello, la subclase declara un método con la misma signatura que la
superclase, pero con un cuerpo del método diferente. El método sustituido tiene precedencia en las llamadas al
método efectuadas sobre los objetos de la subclase.

Sustitución de campos: los campos no pueden ser sustituidos por versiones específicas de las subclases.

Búsqueda de métodos: consiste en examinar en detalle el modo en que se invocan los métodos. También se
conoce con el nombre de asociación de métodos o despacho de métodos.

Polimorfismo de métodos: las llamadas a métodos en Java son polimórficas. La misma llamada a método puede
invocar diferentes métodos en distintos momentos, dependiendo del tipo dinámico de la variable usada para hacer
dicha llamada.

Método abstracto: son métodos definidos en la superclase abstracta que nunca se podrán ejecutar, pues no tienen
cuerpo. Su definición está compuesta solamente de una cabecera de método. Se marca con la palabra clave
abstract.

Figura 4.21 Declaración de un método abstracto en la superclase


Página 16 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

@Override: anotación añadida antes de la versión de un método en la subclase para dejar claro que se está
definiendo una nueva versión de un método heredado.

instanceof: comprueba si un objeto determinado es, directa o indirectamente, una instancia de una determinada
clase.

5. Métodos y constructores
Parámetros: son variables que se definen en la cabecera de un constructor o de un método. Se emplean como
mensajeros temporales, es decir, transportan datos cuyo origen se sitúa fuera y hacen que esos datos estén
disponibles en el interior del constructor o método.

Los nombres de los parámetros dentro de un constructor o método se denominan parámetros formales y los valores
externos de los parámetros son los parámetros reales. Un parámetro formal solo está disponible para un objeto
dentro del cuerpo de un constructor o método que lo declare. Por tanto, el ámbito de un parámetro está restringido al
cuerpo del constructor o método en el que se declara.

El tiempo de vida de un parámetro está limitado a una única llamada a un constructor o método.

Variables locales: tanto los constructores como los métodos pueden contar con variables locales. En su declaración
no aparecen las palabras clave private y public. El tiempo de vida de estas variables coincide con el tiempo durante el
cual se está ejecutado el método o constructor. Se utilizan principalmente como almacenamiento temporal.

NOTA: si una variable local tiene el mismo nombre que un campo, se impedirá acceder a dicho campo desde ese
constructor o método.

Sobrecarga: una clase puede contener más de un constructor o más de un método con el mismo nombre, siempre
que cada uno tenga un conjunto diferente de parámetros.

Interfaz de un método: consta de la signatura del método y de un comentario.

5.1. Métodos

Métodos: operaciones empleadas para manipular objetos. Los métodos se llaman o se invocan. Los métodos
pueden tener parámetros o no.

Cabecera: incluye la signatura, el modificador del método y el tipo de dato que devuelve el método.

Signatura: incluye (en este orden):

 Nombre del método.


 Número de parámetros, sus tipos y el orden de los mismos.

Examen: la signatura es el encabezado de un método y proporciona la información necesaria para invocarlo.

Cuerpo: contiene las declaraciones y las instrucciones que definen lo que hace un objeto cuando se invoca ese
método. Se sitúa tras la cabecera y siempre está encerrado entre llaves “{ }”.

 Declaraciones: se utilizan para crear espacio adicional de variables temporales. Estas variables temporales
son las variables locales.
 Instrucciones: describen las acciones del método.

Página 17 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Instrucción de retorno (return): es la responsable de devolver un valor que se corresponde con el tipo de retorno
indicado en la cabecera del método. Siempre es la instrucción final del método.

Tipo de retorno void: indica que el método no devuelve ningún valor al llamante.

Métodos selectores (get): métodos que devuelven al llamante información acerca del estado de un objeto, es decir,
proporcionan información sobre el estado del objeto. Un selector suele contener una instrucción de retorno.

NOTA: devolver un valor significa que se transfiere una información internamente entre dos partes diferentes del
programa.

Métodos mutadores (set): modifican el valor de uno o varios campos de un objeto.

Métodos estáticos (static): en la llamada se debe incluir el nombre de la clase antes del método. No hace falta crear
un objeto, pues estos métodos pertenecen a la clase. Presentan dos limitaciones importantes:

1. Puede no tener acceso a todos los campos de instancia definidos en la clase. Solo tienen acceso a campos
estáticos.
2. No puede invocar a un método de instancia desde la clase. Solo puede llamar a otros métodos estáticos
definidos en su clase.

EXAMEN: invocar a un método de instancia desde otro método estático provoca un error de compilación.

Métodos no estáticos: en la llamada se debe incluir el objeto y luego el método.

Método principal (main): permite iniciar una aplicación Java sin BlueJ. Cuando se implementa este método en una
clase, se puede ejecutar llamando por comando a java con el nombre de la clase y los parámetros correspondientes
(que se almacenarán en la posición correspondiente de la matriz de String). No es necesario incluir parámetros en
este método, aunque por convención se suele añadir String[] args.

Figura 5.1 Ejemplo de clase que solamente contiene el método main

Llamada a un método: se pueden realizar llamadas a métodos internos o externos a la clase.

 Llamada a un método interno: no tiene nombre de variable.

Figura 5.2 Llamada a un método interno (señalado en violeta)


Página 18 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

 Llamada a un método externo: son llamadas a métodos de otro objeto.

Figura 5.3 Llamada a un método externo (señalado en violeta)

 Encadenamiento de llamadas a métodos: se utiliza para ir accediendo a un método del objeto retornado por
el primer método. Ayuda a simplificar el código.

Figura 5.4 Llamada a métodos sin encadenamiento y con encadenamiento

Notación con punto: está compuesta por un nombre de objeto, un punto, el nombre del método y los parámetros de
entrada.

5.2. Constructores

Constructores: son responsables de garantizar que cada objeto se configure adecuadamente en el momento de
crearlo por primera vez. Este proceso de construcción también se denomina inicialización. Tienen el mismo nombre
de la clase en la que se encuentran definidos y este, generalmente, va a continuación de la palabra public.

Figura 5.5 Ejemplo de constructor

Página 19 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

6. Objetos

6.1. Propiedades de los objetos

Objetos: componentes a partir de los que se construye el modelo. Los objetos se pueden clasificar y se crean a partir
de clases. Representan las instanciaciones individuales de la clase.

Estado: conjunto de valores de todos los atributos que definen un objeto.

La sintaxis de una operación de creación de un nuevo objeto es:

Figura 6.1 Sintaxis para la creación de un nuevo objeto

La operación new hace dos cosas:

1. Crea un nuevo objeto de la clase indicada.


2. Ejecuta el constructor de dicha clase.

EXAMEN: nunca puede volver a llamarse al constructor del objeto una vez ha sido creado.

Interfaz: conjunto de métodos que un objeto pone a disposición de otros objetos.

Objeto anónimo: se utiliza para pasar un parámetro de tipo objeto sin necesidad de declarar una variable. Es un
objeto sin nombre.

Tipo dinámico: es el tipo de objeto que está almacenado actualmente en dicha variable.

Tipo estático: es el tipo tal como está declarado en el código fuente, en la instrucción de declaración de la variable.

6.2. Diagrama de objetos

Diagrama de objetos: muestra la situación en tiempo de ejecución, es decir, la vista dinámica. Cuando una variable
almacena un objeto, el objeto no se almacena directamente en la variable, sino que lo que la variable contiene es una
referencia a objeto. El diagrama de objetos cambia cuando el programa se está ejecutando. Se puede modificar
creando nuevos objetos, invocando métodos o haciendo asignaciones relacionadas con las referencias a objetos. En
el siguiente diagrama, la variable se muestra mediante un recuadro en blanco, y la referencia a objeto aparece como
una flecha.

Variable

Objetos

Referencias a objetos

Figura 6.2 Diagrama de objetos

Página 20 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

7. Palabras clave
Palabras clave: en Java hay unas 50 palabras clave o reservadas. Siempre van en minúsculas.

Modificadores de acceso: definen la visibilidad de un campo, constructor, o método. Los elementos públicos son
accesibles desde dentro la misma clase y desde otras clases; los elementos privados solo son accesibles desde
dentro de la misma clase.

1. abstract: se emplea para definir una clase o método abstracto.


2. assert: se emplea para definir aserciones.
3. boolean: tipo de dato primitivo booleano (lógico), que puede ser true o false.
4. break: instrucción de salto que interrumpe (rompe) la ejecución de un bucle o de una instrucción de control
alternativa múltiple (switch).
5. byte: tipo de dato primitivo entero.
6. case: caso de una instrucción de control alternativa múltiple (switch).
7. catch: se utiliza para definir el tratamiento de una excepción.
8. char: tipo de dato primitivo carácter.
9. class: se utiliza en la definición de una clase.
10. continue: instrucción de salto que interrumpe (rompe) la ejecución de la iteración de un bucle. Pero,
permitiendo continuar al bucle seguir realizando otras iteraciones.
11. default: caso por defecto de una instrucción control alternativa múltiple (switch).
12. do: se usa en la sintaxis de un bucle do while.
13. double: tipo de dato primitivo número real.
14. else: se usa en una instrucción de control alternativa doble (if else).
15. enum: se emplea para definir un tipo enumerado.
16. extends: define la relación de herencia. Se utiliza en la definición de una clase y va seguida del nombre de la
superclase.
17. final: se utiliza para la definición de constantes, métodos (que no podrán ser sustituidos), clases finales
(otras clases no pueden heredar de ellas).
18. finally: incorpora aquellas instrucciones que es preciso ejecutar independientemente de si se ha generado
una excepción en las instrucciones protegidas o no.
19. float: tipo de dato primitivo número real.
20. for: instrucción de control (bucle).
21. if: se emplea para escribir instrucciones de control condicionales.
22. implements: palabra clave para la herencia de interfaces.
23. import: se utiliza en la instrucción de importación para añadir paquetes o clases.
24. instanceof: operador que permite saber si un objeto es una instancia de una clase concreta.
25. int: tipo de dato primitivo número entero.
26. interface: esta palabra se utiliza en la declaración de una interfaz (sustituye a la palabra class).
27. long: tipo de dato primitivo número real.
28. native: modificador que se utiliza para indicar que un método está implementado en un lenguaje de
programación (distinto a Java) dependiente de la plataforma.
29. new: esta palabra clave crea un nuevo objeto de la clase indicada y ejecuta el constructor de dicha clase.
30. null: se utiliza para indicar “ningún objeto” cuando una variable de objeto no está haciendo referencia
actualmente a un objeto concreto. Todo campo que no haya sido explícitamente inicializado contendrá el
valor null de manera predeterminada.
31. package: agrupa a un conjunto de clases.
32. private: declara que un elemento es parte de la implementación (es decir, que está oculto frente a posibles
accesos externos). Provoca el ocultamiento de la información al no permitir que otras clases accedan a esta
parte de la clase. De esta forma se garantiza el acoplamiento débil.

Página 21 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

33. protected: declara un elemento que al que puede accederse desde las subclases. Se suele reservar a
métodos y constructores.
34. public: declara un elemento de una clase (campo o método) como parte de la interfaz (es decir, que es
públicamente visible).
35. return: instrucción de retorno.
36. short: tipo de dato primitivo número entero.
37. static: define variables (campos que se almacenan en la propia clase) o métodos de clase.
38. strictfp: se usa para indicar que se tienen que utilizar cálculos en coma flotante estricto.
39. super: esta palabra se utiliza en el constructor de la clase hija para llamar al constructor de la superclase y
para llamar a métodos de la superclase desde la subclase.
40. switch: instrucción de control alternativa múltiple.
41. synchronized: modificador que se utiliza para indicar que un método o bloque de código es atómico.
42. this: hace referencia al objeto actual. No se puede utilizar en un método estático (ver ejemplo).
43. throw: palabra clave utilizada para lanzar una excepción en el tratamiento de excepciones.
44. throws: sirve para indicar las excepciones que un método puede lanzar.
45. transient: sirve para especificar que un atributo no sea persistente.
46. try: protege el código para el tratamiento de excepciones.
47. void: indica que el método no devuelve ningún valor.
48. volatile: modificador que se usa para indicar que el valor de un atributo que está siendo utilizado por varios
hilos (threads) esté sincronizado.
49. while: se usa para los bucles while y do while.

Ilustración 7.1 Ejemplo de uso del this

Página 22 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

8. Estructuras de control
Condicionales:

1. Condicional if: puede acompañarse del else (no es obligatoria). Permite llevar a cabo una de las acciones
posibles con base en el resultado de una prueba o comprobación. Si la comprobación es verdadera entonces
hace una cosa; en caso contrario, hace algo distingo. Tras evaluar la comprobación condicional, solo se
ejecuta uno de los dos bloques de instrucciones.

Figura 8.1 Estructura de un if y ejemplo

Si hay varias condiciones a evaluar, se puede utilizar else if:

Figura 8.2 Ejemplo de estructura if-else if-else

2. Condicional switch: puede acompañarse con default (tampoco es obligatoria). Se puede utilizar con
variables de los tipos predefinidos byte, short, int, char, objetos de la clase String y tipos enumerados.

Página 23 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Figura 8.3 Estructura de un switch y ejemplo

Bucles:

1. Bucles indeterminados: no se sabe cuántas veces se repite el código.


a. While: se traduce por “mientras”.

Figura 8.4 Estructura de un while y ejemplo

b. Do – While: es equivalente al While pero evalúa la condición al final. Asegura que, aun siendo la
condición falsa, se ejecute una vez el bucle.

Figura 8.5 Estructura de un do-while y ejemplo

Página 24 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

2. Bucles determinados: a simple vista ya se sabe cuántas veces se repite el código.


a. For:

Figura 8.6 Estructura de un for y ejemplo

b. For – each: es adecuado para iterar a través de una colección de tamaño flexible.

Figura 8.7 Estructura de un for-each, lectura y ejemplo

9. Abstracción y modularización
Abstracción: capacidad de ignorar los detallas de las distintas partes, para centrar la atención en un nivel superior
de un problema.

Modularización: proceso de dividir grandes cosas (problemas) en partes más pequeñas.

Divide y vencerás: técnica de resolución de problemas que consiste en dividir un problema en una serie de
subproblemas, que a su vez se dividen en sub-subproblemas, hasta que cada problema individual sea
suficientemente pequeño para poder resolverlo de manera sencilla.

La abstracción y la modularización se complementan entre sí.

Acoplamiento: describe la interconexión de las clases. Se busca que el sistema tenga un acoplamiento débil, es
decir, un sistema en el que cada clase sea fundamentalmente independiente y se comunique con las otras clases a
través de una interfaz compacta y bien definida.

Cohesión: describe lo bien que una unidad de código se corresponde con una tarea lógica o con una entidad. En un
sistema muy cohesionado, cada unidad de código (método, clase o módulo) es responsable de una tarea o entidad
bien definida. Un buen diseño de clases exhibe un alto grado de cohesión. La alta cohesión beneficia la legibilidad y
la reutilización de un diseño.

Cohesión de métodos: un método cohesionado será responsable de una, y solo una, tarea bien definida.

Cohesión de clases: una clase cohesionada representa una entidad bien definida.

Encapsulación: ocultar la información de la implementación a ojos de otras clases. Una adecuada encapsulación de
las clases reduce el acoplamiento y conduce, por tanto, a un mejor diseño.

Página 25 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Diseño dirigido por responsabilidad: es el proceso de diseñar clases asignando unas responsabilidades bien
definidas a cada clase. Este proceso puede emplearse para determinar qué clase debería implementar cada parte de
una función de la aplicación. Lo bien que se utilice el diseño dirigido por responsabilidad influye en el grado de
acoplamiento y, por tanto, incluye de nuevo en la facilidad con la que se puede modificar o ampliar una aplicación.

Localidad de los cambios: hacer cambios en una clase debería tener un efecto mínimo en las clases restantes.

Acoplamiento implícito: situación en la que una clase depende de la información interna de otra, pero dicha
dependencia no es inmediatamente obvia.

Refactorización: actividad consistente en reestructurar un diseño existente para mantener un buen diseño de clases
cuando se modifica o amplía la aplicación.

10. Pruebas y depuración


Pruebas: son la actividad consistente en averiguar si un fragmento de código (un método, una clase o un programa)
presenta el comportamiento deseado. Durante las pruebas es fundamental comprobar los límites (por ejemplo, la
edad de una persona nunca puede ser un número negativo).

1. Prueba manual de unidades dentro de BlueJ. Se refiere a las pruebas de las partes individuales de una
aplicación, como los métodos y las clases. Cualquier método puede (y debe) ser probado después de haber
sido escrito y compilado.
2. Pruebas de la aplicación: consisten en probar la aplicación completa.
3. Automatización de pruebas. Simplifica el proceso de pruebas de regresión.
4. Recorridos manuales: es la actividad consistente en analizar un segmento de código línea a línea mientras
se observan los cambios de estado y otros comportamientos de la aplicación.
 Recorridos verbales: consisten en tratar de explicar a otra persona lo que hace una clase o método.
5. Instrucciones de impresión: son muy efectivas para entender programas o localizar errores pero presentan
las siguientes desventajas:
 No es práctico añadir instrucciones de impresión a todos los métodos de una clase.
 Añadir demasiadas instrucciones de impresión puede conducir a una sobrecarga de información.
 Una vez que han cumplido su propósito puede resultar tedioso eliminarlas.
 También existe la posibilidad de que habiéndolas eliminado, podamos necesitarlas más adelante.

Tipos de pruebas:

 Positiva: es la prueba de un caso que se espera funcione correctamente.


 Negativa: es la prueba de un caso que se espera que falle.

Pruebas de regresión: implican volver a ejecutar pruebas que ya se pasaron anteriormente con éxito, para
garantizar que la nueva versión sigue superándolas. Se deben realizar cada vez que ser realiza un cambio en el
software.

Clase de pruebas: contiene el código para llevar a cabo una serie de pruebas preparadas y comprobar sus
resultados. Esto hace que repetir las mismas pruebas sea mucho más sencillo. Normalmente está asociada a una
clase normal del proyecto. Contiene código para ejecutar pruebas sobre una clase de referencia y para comprobar si
las pruebas han tenido éxito o no.

Banco de pruebas: conjunto de objetos en un estado definido que sirven como base para realizar pruebas de
unidades. Se pueden añadir objetos desde el banco de objetos al de pruebas (también se pueden trasladar desde el
banco de pruebas al de objetos).
Página 26 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

JUnit: es un entorno de pruebas que soporta la prueba estructurada de unidades y las pruebas de regresión en Java.
Se activa por primera vez a través de la pestaña Miscelánea (Miscellaneous) del cuadro de diálogo Preferencias
(Preferences).

Depuración: es el intento de localizar y corregir el origen de un error. Se realiza tras las pruebas.

Escritura de programas para su mantenibilidad: se basa en escribir código de tal manera que se eviten los errores
y que si, a pesar de todo, se producen, puedan ser encontrados lo más fácilmente posible. El estilo de codificación y
los comentarios son parte de esa tarea.

Simulación de carácter temporal o síncrona: en cada paso temporal se pide a cada elemento de la simulación que
lleve a cabo las acciones apropiadas según su estado actual. Resultan mejores para generar visualizaciones de
carácter temporal, porque el tiempo fluye de manera más uniforme.

Simulación dirigida por sucesos o asíncrona: la simulación se dirige manteniendo una planificación de sucesos
futuros. En este tipo de simulación, el tiempo transcurre en cantidades variables. Las simulaciones basadas en
sucesos suelen ser más eficientes y resultan preferibles cuando hay que tratar con sistemas de gran tamaño y con
grandes cantidades de datos.

Aserción: es un enunciado de un hecho que debe ser cierto durante la ejecución del programa. Se pueden utilizar
aserciones para anunciar explícitamente las suposiciones y para detectar más fácilmente los errores de
programación. Para su definición se utiliza la palabra clave assert seguida de una expresión booleana. Si dicha
expresión se evalúa como true, entonces la instrucción de aserción no tienen ningún efecto. Si se evalúa como false,
se generará un error AssertionError.

Figura 10.1 Definición y ejemplo de una aserción

NOTA: las aserciones están pensadas principalmente para proporcionar un modo de realizar pruebas de coherencia
durante las fases de desarrollo y pruebas de un proyecto. No están pensadas para utilizarlas en el código final de uso
comercial.

EXAMEN: una aserción es una expresión que establece una condición que esperamos que sea cierta.

Prototipo: una versión de la aplicación en la que se simula una parte de ella, en vías a experimentar con las
restantes partes.

Página 27 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

11. BlueJ
Interfaz:

Diagrama de clases

Banco de objetos
Code Pad

Figura 11.1 Interfaz

Inspeccionar un objeto:

Figura 11.2 Inspeccionar un objeto

Página 28 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Mostrar la consola y el historial de llamadas a métodos:

Figura 11.3 Mostrar consola y el historial de llamadas a métodos

Mostrar el Code Pad:

Figura 11.4 Mostrar Code Pad

Cuando el resultado de una expresión en el Code Pad es un objeto, se marca con un pequeño símbolo rojo de objeto.
Dicho objeto se puede arrastrar al banco de objetos para utilizarlo más adelante.

Depurador (debugger): es una herramienta de software que ayuda a examinar cómo se ejecuta una aplicación. Se
puede utilizar para localizar errores.

Punto de interrupción: es un indicador asociado a una línea de código fuente, que hará que se detenga la ejecución
de un método en el momento en que se alcance ese punto. Se representa mediante un pequeño símbolo de stop.

Figura 11.5 Punto de interrupción en una línea de código

Mostrar la documentación de una clase:

Figura 11.6 Abrir la visualización en el modo de documentación


Página 29 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Creación de métodos de pruebas:

Página 30 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Figura 11.7 Creación de un método de pruebas

Mostrar las clases de la API: en el menú Herramientas:

Ilustración 11.1 Abrir la documentación de la API en BlueJ

12. Errores
 CurrentModification-Exception: se produce cuando se intenta borrar un elemento de un ArrayList dentro de un
bucle for-each.
 (Array)IndexOutOfBoundsException: este error se genera cuando se intenta acceder a un elemento de una
colección que se encuentra fuera del rango de índices válidos de la colección o matriz.
 Error: cannot find symbol – variable nombre_de_variable: se produce cuando se introducen datos de tipo
String sin comillas dobles o se está utilizando una variable sin asignarle un tipo.
 NullPointerException: se genera cuando se llama a un método de una variable que contiene el valor null. Esta
excepción es no comprobada (hereda de la clase RuntimeException).
 AssertionError: se produce cuando la evaluación de una aserción es falsa.
 IllegalArgumentException: está definido en el paquete java.lang y se utiliza para indicar que se ha pasado un
valor de parámetro real incorrecto a un método o constructor.
 InputMismatchException: esta excepción es no comprobada (hereda de la clase RuntimeException). Se
produce cuando el usuario del programa introduce datos incorrectos (por ejemplo, se solicita un número e
introduce una palabra).
 ArithmeticException: se produce cuando se realiza una operación matemática sin solución, por ejemplo,
dividir por cero. Es una excepción no comprobada.
 NumberFormatException: se genera al introducir un valor numérico no adecuado al tipo de la variable.

Excepción: es un objeto que representa los detalles de un fallo del programa. La excepción se genera para indicar
que se ha producido un fallo.

Página 31 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Lanzamiento manual de excepciones: hay dos etapas en el proceso de generación de una excepción. Primero se
crea un objeto excepción utilizando la palabra clave new; después, se envía el objeto utilizando la palabra clave
throw.

Tras lanzar el error, hay que tratarlo en un bloque try-catch.

Cadena de diagnóstico: esta cadena se puede pasar de forma opcional al constructor de la excepción. Estará a
disposición del receptor de la excepción, a través de los métodos getMessage y toString del objeto excepción. Si
esa excepción no se trata, la cadena se muestra también al usuario y esto conduce a la terminación del programa.

Clases de excepciones:

 Throwable.
 Exception: excepción comprobada.
 RuntimeException: excepción no comprobada.

Figura 12.1 Jerarquía de errores en Java

Categorías de clases de excepción:

1. Excepciones comprobadas. Están pensadas para aquellos casos en los que el cliente debería esperar que
una operación pueda fallar. Su uso requiere comprobaciones adicionales por parte del compilador. En
particular, las excepciones comprobadas en Java requieren que se usen cláusulas throws e instrucciones try.
2. Excepciones no comprobadas. Por lo general indican un error del programa. Es un tipo de excepción cuyo
uso no requiere ninguna comprobación por parte del compilador. Ante este tipo de errores, el programador
debe mejorar el código para evitarlos, es decir, está en la mano del programador que estas excepciones no
ocurran.

Throws: se incluye esta palabra clave en la declaración de un método junto con la clase del error (Exception,
IOException o una subclase) para lanzar un error (objeto) y posteriormente tratarlo. La llamada a este tipo de
métodos debe incluirse en un bloque try-catch. Siempre que un método pueda lanzar una excepción, hay que añadir
esta palabra.

Rutina de tratamiento de excepción: código de programa que protege las instrucciones en las que podría
generarse una excepción. Proporciona código para informar de la excepción y/o recuperarse de la misma, en caso de
que se genere una. Las instrucciones contenidas en un bloque try se conocen con el nombre de instrucciones
protegidas.

Página 32 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

Figura 12.2 Cuerpo de un bloque try y catch

Recuperación de un error: implica llevar a cabo algún tipo de acción constructora dentro del bloque catch y luego
volver a intentar la operación. Pueden realizarse intentos repetidos incluyendo la instrucción try dentro de un bucle.
La recuperación implicará a menudo tener que intentar la operación de nuevo.

Instrucción try con recurso o gestión de recursos automática: permite asegurarse que se ha cerrado un archivo
una vez que se ha terminado con él.

Figura 12.3 Ejemplo de escritura de un archivo de texto utilizando una instrucción try con recurso

Página 33 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez

13. Notas
1. Autocompletar: Ctrl + space.
2. \n: imprime un salto de línea.
3. Dar formato al código: Editar → Disposición automática

Figura 13.1 Dar formato al código

4. Limpiar terminal: Ctrl + K.

EXAMEN: el bytecode es el formato que se obtiene tras compilar una clase .java.

EXAMEN: “==” se utiliza para comparar las referencias de objetos (el “ID” de los objetos), no su contenido. Por tanto,
aunque dos objetos tengan el mismo contenido, si no tiene la misma referencia, serán distintos. Con la siguiente
asignación, se hace que dos objetos sean iguales (incluida su referencia):

Página 34 de 34

Potrebbero piacerti anche