Conceptos Clave de Ingeniería del Software: Herencia, Clases Abstractas y Excepciones
public class AlarmaLuminosa extends Alarma{
private Bombilla bombilla;
public void activar (){
super.activar();
bombilla.encender();
super.umbral = 7.3;
… }}
9) Explicar para qué sirve anteponer la palabra final
en un atributo y para qué sirve anteponer la palabra final
en un método
En un atributo indica que su valor no puede ser cambiado, es decir, es una constante. Tiene que ser inicializado al declararse (o en el constructor/es) y su valor no puede cambiarse posteriormente. En un método indica que no puede ser redefinido por una subclase
10) Si estamos hablando de clases hijas dentro del tema de herencia ¿qué es la sobreescritura de métodos? Justifique razonadamente su respuesta
Un método se puede especializar, redefinir o sustituir en una subclase. El tipo de retorno, el nombre del método, el tipo y número de argumentos debe ser el mismo. Las excepciones lanzadas deben ser como mucho, las declaradas por el método a redefinir. Los modificadores de acceso al método deben ser al menos tan generales como los del método en la superclase.
Por último hay que tener en cuenta dos cosas:
Si el método de la superclase tiene el modificador final
, la subclase no puede sobreescribirlo ya que se trata de un método final
que indica diseño perfecto o que por razones de seguridad no se permite sobreescribir.
Se puede acceder al método de la superclase utilizando la palabra super
antes de llamar al método.
11) Explicar razonadamente qué es una relación de herencia y para qué se usa. Dar un ejemplo gráfico de su representación en UML
¿Qué es?: Es una propiedad esencial de la POO, en la que existen dos clases relacionadas: la clase padre y la clase hija: la clase hija toma todos los atributos y métodos de clase padre.
Aunque hereda todo, la clase hija solo tiene acceso a los miembros de la clase padre con modificadores «public, protected, o package (por omisión)»
• Uso: La herencia se usa sobre todo para:
- La reutilización del código
- Añadir nuevos comportamientos a las clases hijas
- La redefinición de comportamientos
- Creación de clasificaciones jerárquicas de clase(dibujo examen 11-12)
12) Explicar razonadamente que es una clase abstracta, su declaración y cuando se debe usar.
Una clase abstracta (abstract
) es una clase de la que no se pueden crear objetos. Sus métodos pueden ser métodos abstractos (sin código) o no abstractos. Al menos debe existir un método abstracto. Si una clase tiene algún método abstracto, es obligatorio que la clase sea abstracta.
En las subclases deberá ser implementado o volver a declararse como abstracto
• Declaración: [acceso] abstract class claseAbstracta { ... }
• Usos: sirve para proporcionar un modelo de comportamiento que deben seguir las clases hijas, definiendo estas esos comportamientos y a la vez dar algunos métodos de utilidad general.
13) Explicar razonadamente para qué sirve la sentencia this
y poner al menos un ejemplo de todos los usos de esta sentencia.
Dentro de un método o de un constructor, this
hace referencia al objeto actual.
• Ejemplos:
ATRIBUTOS: this.x
{Si x es un atributo de la clase, se refiere al atributo del objeto}
CONSTRUCTOR: this(x, y)
{Está en la primera línea de otro constructor y sirve para llamar a otro constructor –en este caso con dos argumentos-}
MÉTODOS: this.mostrar()
{Invoca al método mostrar()
del objeto actual}
OBJETO ENTERO: copiar (this)
{Pasa el objeto actual al método copiar( )
}
14) Explicar razonadamente qué es un atributo estático y cómo se declara. Explicar qué es un método estático, cómo se declara y un ejemplo de su invocación
Un atributo estático es una variable de clase. Esto significa que es un atributo que es común a todos los objetos de la clase. Este atributo es único y compartido por todos los objetos de esa clase.
• DECLARACIÓN: [acceso] static tipo nombre;
• Un método static
es un método global de la clase. Un objeto no hace copia de los métodos static. Suelen utilizarse para acceder a atributos estáticos y no pueden hacer uso de la referencia this
• DECLARACIÓN: *acceso+ static tipo_retorno nombre (…) ;
• Llamada a métodos estáticos:
NombreClase.nombreMetodoEstatico()1
15) Dentro del tema de Colecciones, ¿qué diferencia hay entre la interfaz List
y la interfaz Set
? Dar un ejemplo de clases que implemente cada una de ellas.111
La interfaz List
define unas colecciones que puede tener elementos duplicados y la interfaz Set
define colecciones que no permiten duplicados.
• Ejemplo de clase que implemente List
: ArrayList
, LinkedList
• Ejemplo de clase que implemente Set
: HashSet
, TreeSet
16) Explicar razonadamente que instrucciones se deben usar para escribir (guardar) y para leer (recuperar) un objeto en un fichero binario. ¿qué restricciones debe cumplir la clase que define esos objetos? Ponga un ejemplo de la cabecera de la clase.
Para escribir se debe crear un flujo de salida del tipo ObjectOutputStream
. El constructor recibirá un fichero, donde se escribirá el objeto. La instrucción para escribir un objeto en un fichero binario, si fich
es un ObjectOutputStream
sería: fich.writeObject(nombreObjeto);
Para leer se debe crear un flujo de entrada del tipo ObjectInputStream
. El constructor recibirá un fichero, donde se leera el objeto La instrucción para leer un objeto en un fichero binario, si fich
es un ObjectInputStream
sería:
nombreObjeto = (ClaseObjeto) fich.readObject();
La clase que define los objetos que van a ser escritos o leidos debe ser serializable, para ello debe implementar la interfaz Serializable
. Todos sus atributos deben ser también serializables.
Ejemplo: public class ClaseObjeto implements Serializable {…}
17)Explicar razonadamente cual es el uso de la variable super
La palabra reservada super permite acceder a los métodos y a los atributos de la superclase (clase padre) que han sido sobreescritos en la clase hija y que no sean privados. Tambien permite llamar al constructor de una superclase desde el constructor de la subclase. Para ello se tiene que utilizar la sentencia super([args]) como primera sentencia del constructor, excepto si se llama a otro constructor de la misma clase con this. Si no se especifica una llamada explícita al constructor de la superclase, implícitamente se realiza una llamada al constructor por defecto de la clase padre.
Ejemplos:acceso a un atributo no privado: super.atributo
Acceso a un metodo no privado: super.metodo()
Acceso a un constructor: super( …);
//Primera instrucción del constructor de la clase hija.
18)Comenta de forma razonada las partes de las que consta el proceso de detección de excepciones
Una excepción es un error en tiempo de ejecución que interrumpe el flujo normal de instrucciones (p.e. desbordamiento, acceso a una posición de una lista que no existe, división entre cero, etc.). Su gestión permite la detección y corrección de errores en ejecución.
Cuando se produce un error dentro de un método, el método crea un objeto y lo entrega al sistema de tiempo de ejecución. El objeto, llamado objeto excepción, contiene información sobre el error, incluyendo su tipo y el estado del programa cuando se produjo el error. Este proceso (creación y entrega del objeto excepción) se denomina lanzar una excepción. Después de que un método produce una excepción, el sistema de ejecución intenta encontrar cómo gestionarlo. Los candidatos para manejar la excepción son la lista ordenada de los métodos que habían sido llamados hasta obtener el método en que se produjo el error (pila de llamadas o call stack).
El proceso de captura de excepciones consiste en gestionar la excepción con un bloque try-catch-finally o relanzar la excepción hacia un método anterior (el método llamador) declarando que este método también lanza dicha excepción (throws). Cuando se controla una excepción con un bloque try-catch-finally el código susceptible de generar errores debe estar acotado en el bloque try. Cuando se produce un error en este bloque, se genera un objeto del tipo de la excepción que se ha producido. Esta excepción se puede recoger en un bloque catch que será el encargado de tratar la excepción. Se pueden incluir tantos bloques catch como sean necesarios, cada uno de los cuales atrapará un tipo de excepción. Por último, de forma opcional se puede incluir un bloque finally cuyas sentencias se ejecutarán siempre (se produzca o no la excepción).
19)¿Para que sirve la herencia? Justifique razonadamente su respuesta
La herencia es una propiedad esencial de la programación orientada a objetos que consiste en la creación de nuevas clases a partir de otras ya existentes. Cuando una clase hereda de otra, contendrá los métodos y atributos de la clase padre. Aunque se hereda todo, la clase hija solamente tiene acceso a los miembros y métodos de la clase padre que tengan los modificadores public, protected, o package (por omisión). En caso de heredar atributos o métodos privados no se podrá acceder a ellos desde la clase hija.
La herencia permite la reutilización de código, añadir nuevos comportamientos a las clases hijas, redefinir comportamientos heredados de la clase padre, y crear clasificaciones jerárquicas de clases. Al permitirse la reutilización de código, hay una mayor fiabilidad del código puesto que es posible encontrar errores y subsanarlos y además, se favorece el prototipado rápido de aplicaciones. La jerarquía de clases asegura que objetos similares tienen vistas públicas similares.
20)Explicar razonadamente qué es un diagrama de casos de uso, para qué sirve y qué elementos tiene.
Los diagramas de caso de uso son diagramas de comportamiento que modelan los aspectos dinámicos de un sistema desde la perspectiva del usuario. Se utilizan en la fase de especificación de requisitos de un proyecto software para detectar qué tiene que hacer el sistema. No son exclusivos de la programación orientada a objetos.
Como objetos gráficos de estos diagramas se modelan los casos de uso, los actores y las relaciones entre ellos. Un actor es cualquier usuario, rol o aplicación con un comportamiento propio que interactúa con el sistema. Los casos de uso se corresponden con una descripción de un conjunto de acciones que ejecuta una aplicación para producir un resultado relevante para un actor (operación o funcionalidad del sistema). Por último, las relaciones modelan cómo interactúan actores y casos de uso en el sistema. Pueden ser de tres tipos: asociación indicando que existe una relación, inclusión cuando un caso de uso incluye otro (hace uso de su comportamiento) y extensión cuando un caso de uso extiende el comportamiento de otro (es una especialización). En ningún momento estos diagramas expresan la secuencia temporal de las acciones a realizar.