Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
01/06/2019
Cristina Otero Rodríguez
1. Tipos primitivos
Enteros:
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.
Boolean: true/false.
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:
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:
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.
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.
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.
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.
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 “ /** ”:
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.
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).
Página 4 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez
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:
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.
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.
Cabecera
Campos
Constructor
Métodos
Página 6 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez
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.
El diagrama de clases cambia cuando se modifica el código fuente bien sea modificando las relaciones entre clases o
creado o borrando clases.
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 “*”.
Las instrucciones de importación deben colocarse siempre antes de las instrucciones de clases en un archivo.
Algunas de las clases predefinidas más destacadas se muestran a continuación, con los métodos más utilizados:
System:
Math:
String:
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.
Scanner:
JOptionPane:
Integer:
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:
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:
Random:
HashMap:
HashSet:
Página 11 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez
Set:
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:
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:
BuferedReader:
Path:
Página 12 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez
FileWriter:
File:
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:
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 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 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.
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.
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:
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:
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.
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.
Ventajas de la herencia:
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.
@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.
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.
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 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é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.
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.
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.
Página 19 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez
6. 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.
EXAMEN: nunca puede volver a llamarse al constructor del objeto una vez ha sido creado.
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.
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
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.
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.
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.
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
Bucles:
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.
Página 24 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez
b. For – each: es adecuado para iterar a través de una colección de tamaño flexible.
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.
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.
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.
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:
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.
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
Inspeccionar un objeto:
Página 28 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez
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.
Página 30 de 34
Programación Orientada a Objetos
01/06/2019
Cristina Otero Rodríguez
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.
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.
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
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
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