Examen de Programación Convocatoria 22 de Junio 2005 Licenciatura de Lingüística y Nuevas Tecnologías Pregunta 1 Tenemos el siguiente programa: public class P1 { public static void main(String args[]) { P1 un = new P1(); P1 dos = new P1(); P1 tres = null; System.out.println("un == dos: " + (un == dos)); // 1 System.out.println("dos == tres: " + (dos == tres)); // 2 P1 cuatro = dos; System.out.println("dos == cuatro: " + (dos == cuatro)); // 3 dos = null; System.out.println("dos == cuatro: " + (dos == cuatro)); // 4 } } ¿Qué imprime cada uno de los cuatro System.out.println numerados 1, 2, 3 y 4 y por qué? 1 Pregunta 2 Tenemos en la misma carpeta las clases P2A (en el archivo P2A.java) y P2B (en el archivo P2B.java). P2A.java public class P2A { public static int c = 3; public int i = 2; private int j = 4; } P2B.java public class P2B { public static void main(String[] args) { int i = -1; P2A un = new P2A(); } } a) Explicar el significado de cada una de estas 6 denominaciones, ilustrando con las variables dentro de P2A y P2B: 1. Variable de objeto: 2. Variable de tipo básico: 3. Variable local: 4. Variable global: 5.Variable de clase: 2 6. Variable de instancia: b) En el cuadro dentro de P2B.java, mostrar cual es la manera correcta y más típica de acceder a cada una de las variables definidas dentro de P2A.java (si es que se pueden acceder...). c) Supongamos que llamamos dentro del main de P2B los siguientes métodos: int num = Integer.parseInt(args[0]); String cadena = "Hola" ; int tamanyo = cadena.length(); Explicar por qué los métodos parseInt y length se llaman de forma diferente. Pregunta 3 Tenemos el siguiente programa: import java.util.*; public class P3 { public static void main(String[ ] args) { String cadena = "Hola! Me llamo Harry. Como estas?"; StringTokenizer st = new StringTokenizer(cadena,"!.?"); while (st.hasMoreTokens()) { String token = (String) st.nextToken(); System.out.println(token); } } } 3 a) ¿Qué imprime el programa a la ejecución? (A notar que el segundo argumento de StringTokenizer es “!.?”, es decir punto de exclamación, punto, punto de interrogación) b) ¿Por qué hacemos import java.util.* al principio de la clase? c) ¿Por qué llamamos a nextToken así: String token = (String) st.nextToken(); Y no así: String token = st.nextToken(); Pregunta 4 a) ¿Qué pasa al ejecutar el siguiente código? class P4a { static void doIt(int[] z) { int temp = z[z.length-1] ; z[ z.length-1 ] = z[0] ; z[0] = temp; } public static void main ( String[] args ) { int[] myArray = {0, 1, 2, 3, 4} ; doIt( myArray ); for (int j=0; j<myArray.length; j++ ) System.out.print( myArray[j] + " " ) ; } } 4 b) ¿Qué pasa al ejecutar el siguiente código? public class P4b { static void doIt( int[] z ) { int[ ] a = z ; a[0] = 99; } public static void main ( String[] args ) { int[ ] myArray = {1, 2, 3, 4, 5} ; doIt( myArray ); for (int j=0; j<myArray.length; j++ ) System.out.print( myArray[j] + " " ) ; } } Pregunta 5 Aquí viene un extracto de la API de la clase ArrayList: boolean add(Object o) Appends the specified element to the end of this list. Object get(int index) Returns the element at the specified position in this list. int size() Returns the number of elements in this list. int indexOf(Object elem) Searches for the first occurence of the given argument, testing for equality using the equals (==) method. Returns the index of the first occurrence of the argument in this list; returns -1 if the object is not found. 5 a) ¿Qué imprime el siguiente programa a la ejecución (líneas numeradas 1 a 4)? import java.util.*; class P5a { int val; public P5a(int x) { this.val = val; } public static void main(String []args) { ArrayList list = new ArrayList(); System.out.println(list.size()); // 1 list.add(new P5a(1)); System.out.println(list.size()); // 2 list.add(new P5a(1)); System.out.println(list.size()); // 3 System.out.println(list.get(0) == list.get(1)); // 4 } } b) Con alguno de los métodos de la API de Java, escribir los dos siguientes métodos: public static boolean isEmpty(ArrayList a): returns true if arraylist a is empty, false otherwise public static boolean isEmpty(ArrayList a) { } public static boolean containsObject(ArrayList a,Object o): returns true if arraylist a contains object o, false otherwise public static boolean containsObject(ArrayList a,Object o) { } 6 c) Tenemos el siguiente código: import java.util.*; public class P5c { public static void main(String[] args) { HashMap h = new HashMap(); String aa = "HELLO"; h.put("one",new Integer(1)); h.put("two",null); h.put("three",new Integer(2)); h.put("four",aa); } } ¿Cuántos elementos tiene el hashmap h y como estan organizados? ¿Qué pasa si añadimos al final de main: h.put(“four”,”HOLA”); ? Pregunta 6 Tenemos el siguiente código: import java.io.*; public class P6 { public static void main(String[] args) throws IOException { FileReader f = new FileReader(args[0]); BufferedReader b = new BufferedReader(f); String s1 = b.readLine(); String s2 = b.readLine(); FileWriter w = new FileWriter(args[1]); while ((s1 != null) && (s2 != null)) { w.write(s1 + " " + s2 + "\n"); s1 = b.readLine(); s2 = b.readLine(); } w.close(); b.close(); f.close(); } } 7 a) Si args[0] corresponde a un fichero que contiene lo siguiente (un carácter por línea): a b c d e ¿Cuál será el contenido del fichero que corresponde a args[1] después de la ejecución? b) Si args[0] corresponde a un fichero que contiene lo siguiente (un único carácter): a ¿Cuál será el contenido del fichero que corresponde a args[1] después de la ejecución? c) ¿Qué son f,b y w y por qué necesitamos b además de f para leer un fichero? Pregunta 7 a) Tenemos el siguiente código: public class P7a { public static void main(String[ ] args) { int i = 3; System.out.println(i); String s = "Hola"; System.out.println(s); } } 8 Partes de este código ilustran el concepto de overloading. Explicar qué es el overloading y por qué nos resulta útil. b) El método String toString() esta definido dentro de la clase Object y también dentro de su sub-clase indirecta Integer. Si escribimos: Object o1 = new Object(); String s1 = o1.toString(); // 1 Object o2 = new Integer(3); String s2 = o2.toString(); // 2 ¿Qué toString() va a ser llamado a la ejecución a cada una de las líneas 1 y 2 y por qué? c) Tenemos al principio de la clase A la siguiente declaración: public abstract class A extends B { ... } ¿Qué quieren decir las palabras claves abstract y extends? Explicar cada uno de estos conceptos. abstract extends 9