Examen Teórico Convocatoria de Febrero de 2018 Nombre: DNI: Grupo: 1. Dado un proyecto Java en Eclipse que tiene como clase principal proyecto.programa y requiere de la librería matemática de Apache commons-math.jar, responde de forma razonada a las siguientes cuestiones: a) Suponiendo que estamos situados en la raíz del proyecto Eclipse, sería correcta la ejecución de la aplicación con el siguiente comando? > java cp bin proyecto.programa b) En qué directorio se encuentra la clase principal? c) Qué diferencia hay entre las siguientes declaraciones? import proyecto.programa; import proyecto.*; import static proyecto.programa.*;
2. Dado el siguiente código, contesta a las siguientes preguntas justificando las respuestas: class A { public A(){ print(); void print(){ System.out.println("A"); class B extends A { void print() {System.out.println("B"); public class Prueba { public static void main(string[] args) { A oa = new B(); oa.print(); a) Es correcto que B no implemente ningún constructor? b) Cuál es el resultado de la ejecución del código anterior? c) Supuesta otra clase C que hereda también de A es posible modificar la signatura (visibilidad, tipo de retorno, nombre, parámetros) del método print si se redefine en C?
3. El método abrirconexion devuelve un objeto URLConnection que permite comunicarse con una URL. Dado que el constructor de la clase URL declara que puede lanzar la excepción MalformedURLException (descendiente de IOException) y que el método openconnection declara que puede lanzar la excepción IOException, el siguiente código no compila: public URLConnection abrirconexion(string urlcadena) { URL url = new URL(urlCadena); URLConnection urlconnection = url.openconnection(); return urlconnection; a) Modifica el método para que compile y no lance ninguna excepción sino que devuelva el valor null en el caso de que se produzca algún error durante la ejecución. b) Modifica el método para que compile dejando pasar las excepciones que se produzcan en la ejecución. Explica las diferentes alternativas. c) El método abrirconexion tiene como requisito que la cadena que se pase como parámetro tiene que ser significativa, esto es, debe ser distinta de null y distinta de la cadena vacía. Incluye el control de precondiciones en el método.
4. Contesta de forma razonada a las siguientes cuestiones: a) Cómo está implementado el método clone en las colecciones? Ilustra la respuesta con un ejemplo utilizando un diagrama. b) En el código que se muestra a continuación, la conversión de tipos (casting) al resultado de la llamada al método clone sobre la lista de puntos lo marca el compilador como un warning. Explica por qué. public static void main(string[] args) { LinkedList<Punto> puntos = new LinkedList<Punto>(); //... se crean y añaden objetos punto a la lista LinkedList<Punto> copia = (LinkedList<Punto>)puntos.clone(); c) Dada una variable var escribe un fragmento de código que consulte si el tipo dinámico de la variable es A y otro en el que se pregunte si es compatible con A.
5. Contesta a las siguientes preguntas justificando la respuesta: a) En Java 8, qué declaraciones pueden formar parte de una clase abstracta y no de una interfaz? b) Dada la declaración de la siguiente interfaz: interface Proveedor { Object getdato(); Programa una clase que implemente la interfaz y que aplique la regla covariante. c) Qué beneficio tiene el que las colecciones implementen la interfaz Iterable?
6. Implementa un método de clase que reciba como primer parámetro una colección de cadenas donde se van a añadir todas las cadenas que se pasan como segundo argumento (argumento variable). Escribe un fragmento de código que muestre su uso.
7. Sea Tipo una clase abstracta, dado el siguiente código, contesta de forma razonada a las siguientes cuestiones: Tipo o1 = XXX; OtroTipo o2 = (OtroTipo) o1; a) Puede ser OtroTipo también una clase abstracta? b) Qué relación existe entre OtroTipo y Tipo para que el casting sea correcto en tiempo de compilación? c) Por qué podríamos sustituir XXX para que el casting falle en tiempo de ejecución? Cómo indica Java el fallo en el casting?
8. En relación a las colecciones de Java, contesta de forma razonada a las siguientes preguntas: a) Hemos estudiado que los métodos equals y hashcode se tienen que redefinir de forma consistente en una clase. Qué significa esto? Por qué tiene que cumplirse esta condición? b) Dada la construcción de los siguientes objetos: Integer[] array = new Integer[10]; ArrayList<Integer> lista = new ArrayList<Integer>(10); Escribe el código Java que: - Muestre en la consola el tamaño de cada colección, indicando qué se imprimirá en cada caso. - Consulta el elemento que hay en la posición 1 en cada colección, indicando el resultado de la ejecución.
9. Dada la clase java.time.localdate de Java y sea la variable fechas una colección de objetos de esta clase. Utiliza el procesamiento basado en streams para programar los siguientes casos: a) Almacena en una lista todas las fechas entre 2013 y 2015 ordenadas atendiendo al orden natural. b) Cuenta todas las fechas del año 2015. c) Consulta si existe alguna fecha cuyo año sea 2001. Nota: la clase LocalDate dispone de los métodos de instancia isafter, isbefore, getyear.
10. En relación a la características de programación funcionai de Java 8: a) Implementa un método genérico que se denomine imprimedatosutiles que reciba como parámetro una lista y un predicado y que imprima en la consola todos los elementos de la lista que cumplan el predicado que se pasa como parámetro. Es requisito que el recorrido se haga con un iterador explícito. b) Escribe un método de prueba (main) que cree una lista de números e imprima los números impares. Para ello se debe llamar al método del apartado a) y utilizar expresiones lambda para definir el predicado.