Programación(Orientada a Objetos con Java) Prueba nº 1 Dr. Eric Jeltsch F. Preg. 1 Dado el siguiente código Java. Se pide a) Una vez realizado el proceso de compilación (virtual), informe si el programa compila correctamente(es decir, libre de errores) o no. Justificando exactamente en donde ocurre el error, si es que ocurre. b) En caso de error, diga como mejorar el código, pero sin hacer grandes cambios. Se supone que la salida debería informarme de los Km. por Litro (KpL). class Transporte { public static void main(String args[]) { Vehiculo vehiculo = new Vehiculo(); vehiculo.print(); } } class Vehiculo { public Vehiculo (double suKmporLitro) { KmporLitro = suKmporLitro; } public void print() { System.out.println("KpL: " + KmporLitro); } private double KmporLitro = 10; } Solución: C:\Archivos de programa\Xinox Software\JCreatorV3 LE\MyProjects\lab2\src\Transporte.java:3: cannot resolve symbol symbol : constructor Vehiculo () location: class Vehiculo Vehiculo vehiculo = new Vehiculo(); ^ 1 error Process completed. No, el código no compila. Notar que la clase Vehiculo no posee un constructor por defecto, pero en vez de eso requiere un double para el constructor. Entonces, la declaración Vehiculo vehiculo = new Vehiculo(); generara un error durante su compilación. Para corregir el código debemos declarar (o mejor dicho llamar al constructor) con un argumento double. Es decir, por ejemplo Vehiculo vehiculo = new Vehiculo(12.3); (nuestro auto es uno económico). Tras lo cual se obtiene el resultado, KpL: 12.3 Preg. 2 Dado el siguiente código Java. Se pide c) Una vez realizado el proceso de compilación (virtual), informe si el programa compila correctamente(es decir, libre de errores) o no. Justificando exactamente en donde ocurre el error, si es que ocurre. d) En caso de error, diga como mejorar el código, pero sin hacer grandes cambios. Se supone que la salida debería informarme de la marca del Vehículo. class Transporte { public static void main(String args[]) { Auto gol = new Auto("Volkswagen"); gol.print(); ___________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena. 1 Programación(Orientada a Objetos con Java) Prueba nº 1 Dr. Eric Jeltsch F. } } class Vehiculo { public void print() { System.out.println("KpL: " + KmporLitro); } private double KmporLitro = 10; } class Auto extends Vehiculo { public Auto (String suMarca) { marca = suMarca; } public void print() { System.out.println("Marca: " + marca); } private String marca; } Solución: El código compila sin error, y tras su ejecución se visualiza por consola el mensaje. Marca: Volkswagen. Preg. 3 Dado el siguiente código Java. Se pide e) Una vez realizado el proceso de compilación (virtual), informe si el programa compila correctamente(es decir, libre de errores) o no. Justificando exactamente en donde ocurre el error, si es que ocurre. f) En caso de error, diga como mejorar el código, pero sin hacer grandes cambios. Se supone que la salida debería informarme de la marca del Vehículo y los KpL. class Transporte { public static void main(String args[]) { Auto gol = new Auto("Volkswagen"); gol.setKmporLitro(26.9); gol.print(); } } class Vehiculo { public void print() { System.out.println("KpL: " + KmporLitro); } protected void setKmporLitro (double kpl) { KmporLitro = kpl; } private double KmporLitro = 10; } class Auto extends Vehiculo { public Auto (String suMarca) { marca = suMarca; } ___________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena. 2 Programación(Orientada a Objetos con Java) Prueba nº 1 Dr. Eric Jeltsch F. public void print() { System.out.println("Marca: " + marca); System.out.println("KpL: " + KmporLitro); } private String marca; } Solución: C:\Archivos de programa\Xinox Software\JCreatorV3 LE\MyProjects\lab2\src\Transporte.java:22: KmporLitro has private access in Vehiculo System.out.println("KpL: " + KmporLitro); ^ 1 error Process completed. No, el código no compila. La clase Auto extends Vehiculo, el método setKmporLitro en Vehiculo es protected, ella es heredada por la clase Auto y llama a gol.setKmporLitro, lo cual esta bien. Sin embargo, el método print de la clase Auto la salida es KmporLitro un double. Pero, KmporLitro es declarado como private double en la clase Vehiculo y por tanto no es heredada por Auto. Por lo tanto, la línea de salida de KmporLitro es la causante de la falla en la compilación. Podemos mejorar o levantar este problema si cambiamos la declaración de la variable KmporLitro en Vehiculo por protected o public. El código corregido, y tras su ejecución se visualiza por consola el mensaje. Marca: Volkswagen. KpL: 26.9 Preg. 4 a) Considerando las siguientes clases. public class Perro { public void ladrar() { System.out.println("El perro ladra"); } public void bravo(Perro d) { System.out.println("A"); } public void bravo(Collie c) { System.out.println("B"); } } public class Poodle extends Perro { public int menear_cola() { return 1; } } public class Collie extends Perro { public void ladrar() { System.out.println("El collie ladra"); } public int menear_cola() { return 2; } ___________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena. 3 Programación(Orientada a Objetos con Java) Prueba nº 1 Dr. Eric Jeltsch F. public void bravo(Poodle p) { System.out.println("D"); } } Y dada las siguientes declaraciones, las que son: Perro Rin_Tin_Tin = new Perro(); Collie Lassie = new Collie(); Poodle Flupi = new Poodle(); Perro Dicki = new Collie(); Se pide, analizar la salida y justificarla. Observación: las declaraciones son individuales y su resultado no altera el resultado de la siguiente sentencia o la de las demás, para cuando Ud. haya encontrado un error en alguna de las declaraciones. Declaración Rin_Tin_Tin.ladra(); Lassie.ladra(); Flupi.ladra(); Dicki.ladra(); System.out.println(Rin_Tin_Tin.menear_cola()); System.out.println(Lassie.menear_cola()); System.out.println(Flupi.menear_cola()); Rin_Tin_Tin.bravo(Rin_Tin_Tin); Rin_Tin_Tin.bravo(Lassie); Rin_Tin_Tin.bravo(Flupi); Rin_Tin_Tin.bravo(Dicki); Lassie.bravo(Rin_Tin_Tin); Lassie.bravo(Lassie); Lassie.bravo(Flupi); Lassie.bravo(Dicki); Salida y Justificación. El perro ladra El collie ladra El perro ladra El collie ladra Dynamic binding sobre el parámetro, en tiempo de ejecución, Dicki es descubierto que es un Collie, de manera que el método de Collie es llamado. error Rin_Tin_Tin es un Perro y la clase Perro, no tiene un método menear_cola(). 2 1 A B A La clase Perro no posee un metodo bravo() que tome a Poodle como parametro. Pero Flupi es también un Perro, de manera que el primer método bravo() en Perro le corresponde la llamada. A A Lassie es un Collie y la clase Collie no tiene método bravo() que tome a Perro como parametro. Pero hereda de Perro, de manera que lo usa. B Similar al anterior. D A ___________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena. 4 Programación(Orientada a Objetos con Java) Prueba nº 1 Dr. Eric Jeltsch F. Preg. 5 Se da una clase llamada CD_Ordenables, un constructor y métodos apropiados, tales como getArtista() y getTitulo(). Se pide implementar la interface Comparable para ordenar los CD por artista y por título. public class CD_Ordenables implements Comparable { private String titulo, artista; private double valor; private int pistas; //----------------------------------------------------------------// Un constructor con una información específica. //----------------------------------------------------------------public CD_Ordenables (String elTitulo, String elArtista, double elValor, int lasPistas) { titulo = elTitulo; artista = elArtista; valor = elValor; pistas = lasPistas; } //----------------------------------------------------------------// Returns el nombre del artista para CD_Ordenables. //----------------------------------------------------------------public String getArtista() { return artista; } //----------------------------------------------------------------// Returns el título para CD_Ordenables. //----------------------------------------------------------------public String getTitulo() { return titulo; } Solución: //----------------------------------------------------------------// Determine la relación de orden entre nombre de artista y título. Utilizando la interface Comparable //----------------------------------------------------------------public int compareTo (Object obj) { CD_Ordenables otro = (CD_Ordenables) obj; int result = artista.compareTo (otro.getArtista()); if (result == 0) result = titulo.compareTo (otro.getTitulo()); return result; } ___________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena. 5 Programación(Orientada a Objetos con Java) Prueba nº 1 Dr. Eric Jeltsch F. Preg. 6 a)Un PC está compuesto por un Monitor, un Sistema, un Teclado y, opcionalmente, un ratón. Por otra parte el sistema tiene una tarjeta madre, uno o varios procesadores, una o varias tarjetas de memoria (RAM) y uno o varios Discos. Se pide que grafique un modelo de diagrama de clases UML, que represente la composición de un PC con estos diferentes componentes. b)Construirse un diagrama de clase modelado con UML para diferentes tipos de figuras, según sus dimensiones. La clase Figura debería ser abstracta y clase madre, pero que según su dimensión, (es decir, recta real, plano real o espacio real), puedan sus clases derivadas ser equipadas con ciertos atributos y métodos que son ad-hoc al ambiente en donde se encuentran. Por ejemplo, los puntos de la recta real no deberían tener profundidad, pero si los objetos del espacio, etc. ___________________________________________________________________________ Escuela Ingeniería en Computación, Universidad de La Serena. 6