martes, 22 de diciembre de 2009

Tenemos 2 de Argumentos variables y otras 2 más...

Nota: Si no ve bien las imágenes del código puede dar click en ella y esta se mostrará más fielmente en una nueva pantalla.

1.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?



[A].- Error de compilación
[B].- Se imprime 1
[C].- Se imprime 2
[D].- Se imprime 3
[E].- Se imprime 4
[F].- Se lanza una excepción en ejecución

2.- ¿Cuál es el resultado al compilar y ejecutar este código?
Suponga que en ejecución se pasan los parámetros de la siguiente manera:
>java PruebaVarArgs2 arg1 arg2 arg3



[A].- Se imprime "entro en arreglo"
[B].- Se imprime "entro en elipsis"
[C].- Se lanza IllegalArgumentException
[D].- Se lanza ArrayIndexOutOfBoundsException
[E].- El programa no puede compilar
[F].- Ninguna de las anteriores

3.- ¿Que se imprime al compilar y ejecutar el siguiente código?

[A].- This is the default outputtwentyten
[B].- twentyten
[C].- twenty
[D].- Error de compilacion
[E].- Excepción en ejecución

4.- ¿Qué se imprime en pantalla al compilar y ejecutar el siguiente código?

[A].- medidas finales (Alto: 50.0, Ancho: 20.0)
[B].- medidas finales (Alto: 60.0, Ancho: 30.0)
[C].- medidas finales (Alto: 80.0, Ancho: 20.0)
[D].- medidas finales (Alto: 80.0, Ancho: 30.0)
[E].- medidas finales (Alto: 60.0, Ancho: 20.0)
[F].- medidas finales (Alto: 50.0, Ancho: 30.0)

Respuestas Correctas:

1.- [D]. Se imprime 3.
Si, el compilador no tiene ninguna dificultad al compilar este código, pero en la ejecución como ambos métodos pueden ejecutar el código se le da prioridad al que recibe dos parámetros por defecto. Es decir si llamo a metodo(), o metodo(5), o metodo(1,8,7), se imprime 0, 1 y 3 respectivamente que es la longitud de z, pero al llamar a metodo(6,2) se ejecuta metodo(int x, int y) y por lo tanto se imprime 3 que es el resultado de 6 entre 2.

2.- [E]. El programa no puede compilar:
Esto debido a que el compilador interpreta tanto método String[] como String... como arreglos y por lo tanto el método está duplicado, por lo tanto el programa no compila.

3.- [B]. twentyten:
C
omo k vale 20, el programa imprime twenty, luego, como no existe un break, continúa abajo hasta case 10, por lo que imprime ten también. La compilación tiene efecto aunque default este de primero y aunque esté en cualquier parte de switch este sólo se ejecuta si ninguno de los case coincide.

4.- [C]. medidas finales (Alto: 80.0, Ancho: 20.0):
Java por defecto pasa los parámetros por valor. Para referencias y arreglos puedo cambiar el contenido pero no puedo asignarle una nueva referencia. Debido a esto, la línea 24 deja a rectangulo igual (50.0, 20.0), pero al llamar a cambiarAlto si cambia el valor dentro de la referencia y por lo tanto cambia el alto a 80.0, por lo tanto las medidas finales son Alto: 80.0 y Ancho 20.0

lunes, 30 de noviembre de 2009

Tres preguntas variadas

1.- Cuál es el resultado de compilar y ejecutar el siguiente código?



[A].- Imprime CAMain
[B].- Imprime ABCAMain
[C].- Imprime BCAMain
[D].- Imprime CBAAMain
[E].- Error de compilación
[F].- Excepcion en la ejecución


2.- Cual es el resultado al compilar y ejecutar el siguiente código?



[A].- 0123
[B].- 13
[C].- 1234
[D].- Error de compilación
[E].- Excepción en tiempo de ejecución

3.- Cual es el resultado al compilar y ejecutar el siguiente código?

[A].- Se imprime intenta, atrapa, finalmente y luego se lanza excepcion.
[B].- Error de compilación. Método main no debe lanzar (throws) Excepciones.
[C].- Error de compilación linea 17. No se puede lanzar excepcion en bloque finally.
[D].-Ninguna de las anteriores.


Respuestas:

1.- [C]: Debido a que cuando se crea el objeto C en la línea 19, se llama a los constructores por defecto de A, B y C, pero el constructor de A no hace nada (constructor por defecto), el método A que aparece allí es un método de clase ya que devuelve "void" (no es un constructor ya que tiene la palabra void), entonces al invocarse el constructor B se imprime B, luego se imprime C que es el constructor de C, y luego se invoca al mátodo A en la línea 20 por lo que se imprime A, para termina se imprime Main.

2.- [A]: Debido a que a es "true" esto hace que se entre en la estructura if sin verificar la segunda condición, es decir (++x) > 0. Por lo tanto se imprimen los valores que trae x por defecto del ciclo for.

3.- [D].- Como e1 = e está en una estructura catch el compilador no tiene la garantía de que esta sentencia se ejecute y por lo tanto se lanza una excepción en esta línea ya que el compilador no tiene la garantía que e1 sea inicializada.

jueves, 26 de noviembre de 2009

Tres preguntas de colecciones y genericos.

Ahora tengo tres preguntas que aunque cortas me parecen claves saber para la programación con Genéricos y Colecciones.

1.- Cuál es el resultado de compilar y ejecutar el siguiente programa?


[A].- 15.09
        1.0
        1.0
        2.0
[B].- 15.09
        1.0
        2.0
[C].- 15.09
        1
        1
        2
[D].- 15.09
        1.0
        1
        2
[E].- Error de compilacion

2.- Qué opción se debe colocar en la línea 6 donde aparece XXXX (las 4 xs) para que el programa compile?



[A].- Object[ ]
[B].- Integer[ ]
[C].- int[ ]
[D].- cualquiera de las anteriores
[E].- A o B
[F].- B o C


3.- Cuál es el resultado de compilar y ejecutar el siguiente código?




[A].- truetrue
[B].- truefalse
[C].- falsetrue
[D].- falsefalse
[E].- Error de compilación
[F].- Exception en tiempo de ejecución

RESPUESTAS.-
1.-[E] Hay un error de compilación en la linea 14 debido a que no puedo asignar un objeto ArrayList<Double> a uno ArrayList<Object> ya que en genericos no hay relación de superclase y subclase, es decir se comportan como objetos distintos. Si se quisiera realizar esta operación puede cambiar la línea 5 de List<Object> a List<?> (Comodín) para mas información consulte el artículo de Genéricos Aquí

2.-[A] el método toArray() de List devuelve un arreglo de tipo Object[ ].

3.-[E] Si se desea saber si un objeto TreeSet o Collection debe usarse las colecciones pero sin los tipos de datos parametrizado, algo como:
coleccion instanceof TreeSet
coleccion instanceof Collection
No se puede saber si es una instancia de un genérico parametrizado.

sábado, 31 de octubre de 2009

Ahora son 4 preguntas.

Nota: Si deseas ver mejor la imagen puedes hacer click sobre ella.

1.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?


[A].-Error de compilación en línea 6. El constructor no puede tener valor de retorno.
[B].-El programa compila pero lanza un error en tiempo de ejecución en línea 13, ya que se intenta cambiar un valor constante.
[C].-Se imprime 35
[D].-Se imprime 55
[E].- Error de compilación en línea 13, mala llamada al constructor.
[F].-Ninguna de las anteriores

2.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?

[A].- El programa compila y ejecuta sin problemas. No se genera salida.
[B].- ClassCastException en tiempo de ejecución.
[C].- Error en la compilación.
[D].-Ninguna de las anteriores.

3.- ¿Qué resulta al compilar y ejecutar el siguiente código?. Suponga que las aserciones están ensambladas:

[A].- Error de compilación.
[B].- Sólo se imprime ABC.
[C].- Se imprime ABC y se lanza AsertionException.
[D].- Se impime ABC y se lanza AsertionError.


4.- ¿Cuál es la salida generada al ejecutar el siguiente código?


[A].- 123
000
123
[B].- 000
123
123
[C].- 123
123
000
[D].- 101202603
123
123
[E].- 000
123
[F].- 123
101202603
123

Respuestas Correctas:
1.- [F]:
Sucede un error de compilación, pero en la línea 7 debido a que en un método no constructor no puede cambiarse el valor de una constante (final) en este caso la variable final VALOR. La A es incorrecta ya que debido a que el método public int Ejecutable devuelve un entero se convierte en un método no constructor. B, C y D es incorrecta debido a que el sistema no compila.

2.- [C]:
No se puede castear dos clases que tengan el mismo padre, podría crearse una instancia de la clase padre llamado p, podriamos hacer p = (Hija2) h2; o h2 = (Padre) p; pero entre dos clases que tienen el mismo padre no puede haber un casteo.

3.- [A]:
Hay error de compilación debido a que en el método f la sentencia default del switch no tiene valor de retorno y tampoco lanza una exception. La aserción no es suficiente para el compilador.

4.- [B]:
Hagamos una traza del programa: Primero se ejecuta el método main que realiza una instancia de PruebaConstructor( ). Este constructor hace una llamanda al constructor con tres enteros pasando los valores 101, 202 y 603, a su vez este llama al método inicializar pasandole los valores recibidos. Al llegar al método inicializar se hace la primera impresión llamando a this.uno, this.dos y this.tres pero hasta este momento no han sido inicializados y por eso imprimen sus valores por defecto (tres ceros se imprimen en la línea 14). Luego en las líneas 15, 16 y 17, this.uno toma el valor 1, this.dos toma 2, y this.tres se le asigna 3, debido al operador ternario. Estos se imprimen en la línea 18, luego de esto se retorna el control a PruebaConstructor que recibe tres enteros, aquí no hay mas sentencias, se retorna a PruebaConstructor( ) que imprime 123 debido a la línea 6. Resultado respuesta B.

domingo, 25 de octubre de 2009

1. ¿Cual de las siguientes opciones son los códigos que deben colocarse en las líneas 3 y 10 respectivamente, para que la salida imprima "Buena Opcion"?


[A].- this.Interna.metodo1(); y this.Externa.metodo2();
[B].- new Interna().metodo1(); y new Externa().metodo2();
[C].- new Interna().metodo1(); y Externa.this.metodo2();
[D].- Interna.this.metodo1(); y Externa.this.metodo2();
[E].- this.Interna.metodo1(); y new Externa().metodo2();
[F].- new Interna().metodo1(); y this.Externa.metodo2();

2.- ¿Cuál es el resultado de compilar y correr el siguiente código?


[A].- imprime enteroCorto100
[B].- imprime puntoFlotante100
[C].- imprime doblePrecision100
[D].- Error de compilación. No hay constructor para entero.
[E].- Error en tiempo de Ejecución.

3.- ¿Cuál es la salida al compilar y ejecutar el siguiente código?



[A].- 0
[B].- 3
[C].- 4
[D].- 5
[E].- 6
[F].- Error de compilacion.

Respuestas Correctas:
1.-Respuesta correcta: C.
La opción A es incorrecta ya que Interna no es un campo de Externa ni viceversa, por lo tanto tampoco lo son las opciones E y F. La opción B, aunque compila lanza un StackOverflowError, debido a que en el constructor de Externa creo una instancia de Interna y dentro de Interna llama un constructor de Externa.
La opción D no es correcta ya que Interna.this.metodo1() se usa sólo si estoy dentro de una clase interna para llamar al método de la clase externa.
La opción correcta es la C, debido a que creo una nueva instancia de Interna en la clase externa y luego hago una llamada al metodo2 sin crear una nueva instancia.

2.-Respuesta correcta: B.
La respuesta correcta es B debido a lo que se llama promoción de argumentos, donde el tipo de cada valor en una expresión se promueve a su tipo "más alto" en la expresión.
las reglas de promoción son:
short o char --> int --> long --> float --> double:
Por lo tanto como no hay constuctor para int ni para long, entonces el valor es promovido hasta float porque este tiene constructor.

3.- Respuesta correcta: F.
La sentencia this() para llamar a otro constructor dentro de un constructor, debe ser la primera sentencia del mismo.

miércoles, 30 de septiembre de 2009

Nuevas Preguntas de ensayo para el SCJP 5.0

Saludos compañeros y bienvenidos de nuevo a un nuevo articulo de Acerca de Java. Allí van, tres preguntas más para nuestra preparación a la prueba SCJP 5.0.

1.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?[A].- El programa compila y ejecuta sin producir ninguna salida.

[B].- Error de compilación. Hace falta sincronización de metodo().

[C].- Error de compilación. Falta sentencia llamada al método notify() o notifyAll() en alguna parte del codigo.

[D].- Se lanza IllegalMonitorStateException en tiempo de ejecución

[E].- Ninguna de las anteriores

2.- En el siguiente código. ¿Cuál línea imprime false?


[A].- Línea 6.
[B].- Línea 7.
[C].- Línea 8.
[D].- Línea 9.
[E].- Más de una línea imprime false.
[F].- Ninguna de las anteriores

3.- ¿Cuál es el resultado de compilar y ejecutar el siguiente código?
[A].- Se imprime: CHAO Desde HOLA Hacia
[B].- Se imprime CHAO Desde Hacia HOLA
[C].- Se imprime HOLA CHAO Hacia Desde
[D].- Se imprime HOLA CHAO Hacia Desde HOLA
[E].- Error en tiempo de compilación.
[F].- Error en tiempo de ejecución.

1.- Respuesta correcta: D. IllegalMonitorStateException.
Se lanza IllegalMonitorStateException ya que el metodo wait() no se encuentra en un método sincronizado. La sincronización se verifica en tiempo de ejecución por lo tanto la opción B no es correcta como tampoco es necesario encontrar en el código una sentencia notify o notifyAll. El código compila pero lanza la excepción en ejecución.

2.- Respuesta Correcta: D. Línea 9.
Recordemos que el método equals verifica el contenido de las variables String y devuelve verdadero en caso de ser iguales, por otra parte == verifica que apunten al mismo objeto. Los objetos str1 y str2 apuntan al mismo objeto "Hola" por lo tanto arrojan verdadero en equals y ==, pero str3 aunque tiene el mismo contenido "Hola" no apuntan al mismo objeto ya que crea un nuevo objeto String a partir de str1, por lo tanto la línea 9 imprime false.

3.- Respuesta Correcta: A. Se imprime: CHAO Desde HOLA Hacia
TreeSet almacena objetos no duplicados en forma ordenada. Hay que recordar que HOLA aparece primero a Hacia a pesar de que la a primero está en el alfabeto, pero en sistema La O mayúscula aparece primero que la a minúscula y por lo tanto aparecerán en ese orden.

Es todo hasta ahora. Espero les haya gustado el artículo. Nos vemos en una próxima edición.

domingo, 20 de septiembre de 2009

Saludos compañeros y bienvenidos a mi nuevo artículo de Acerca de Java y, como lo prometido es deuda aquí van las primeras tres preguntas de Java:

1. ¿Cuál será el resultado de compilar y ejecutar el siguiente código?

A.- Se imprimer: "Valor de y: 0"

B.- Se imprime: "Valor de y: 1"

C.- Se imprime: "Valor de y: 2"

D.- Se imprime: "Valor de y: 3"

E.- Error de compilación línea 19: No se ha inicializado out.

F.- Ninguna de las anteriores

2.- ¿Cuál será el resultado de compilar y ejecutar el siguiente código?



A.- Error de compilación: Línea 9: No se puede lanzar excepción una vez atrapada.

B.- Se imprime:
Ejecuto metodo 1
Excepcion metodo 1
Excepcion metodo 2

C.- Se imprime:
Ejecuto metodo 1
Excepcion metodo 1
Excepcion metodo 2
Final metodo 1

D.- Se imprime:

Ejecuto metodo 1

Excepcion metodo 1

Final metodo 1

Excepcion metodo 2


E.- Compila bien, pero lanza excepción en tiempo de ejecución.

3.- ¿Cuál será el resultado de compilar y ejecutar el siguiente código?

A.- Error de compilación.

B.- Se imprime:

Constructor Clase 1

Primer constructor Clase 2

Constructor Clase 1

Llamada String


C.- Se imprime:

Primer constructor Clase 2

Llamada String

D.- Se lanza Excepción en tiempo de ejecución.



Respuestas:

1.- La respuesta es F. Esto debido a que el compilador cree que pudiera no inicializarse la variable "ye" (y) antes de imprimirla. Si se ve bien el código podrá verse que existen bloques if else if, pero no hay una sentencia else que indique al compilador que de alguna manera va a entrar a inicializar y, es decir, no hay error lógico debido a que sabemos que la variable y va a inicializarse ya que i toma o un valor menor a cero, mayor a cero o igual, pero no se lo estamos indicando al compilador, si cambiamos la línea 15 con una sentencia else eliminamos el error de compilación. y se de esa forma podría imprimirse 2, pero el compilador tal como está escrito no lo interpreta así.

2.- La respuesta es D. Según el orden en que se ejecuta el código tenemos: en el método main, se llama al método 2, que intenta ejecutar el método 1, aquí se imprime como primera línea "Ejecuto metodo 1", luego se lanza la excepción que es atrapada por el mismo método, se imprime "Excepcion metodo 1", luego se ejecuta el bloque finally que imprime: "Final metodo 1". Luego, se lleva al control al método 2 con lo que se llama Limpieza de la Pila ya que la excepción lanzada en la línea 9 no puede ser atrapada por método 1. Por ello se atrapa la excepción en el método 2 y se imprime: "Excepcion metodo 2".


3.- La respuesta es A: Al crear un constructor que recibe un parámetro entero en la Clase1 se elimina el constructor por defecto que no recibe parámetros, por lo tanto al crear un constructor en la clase derivada (Clase2) se debe recordar que la primera sentencia es la llamada al constructor de la super clase, si hay un constructor que no recibe parámetros en la super clase la llamada es implícita super(), pero en este caso no hay constructor por defecto y por lo tanto debe llamarse explícitamente al constructor de la super clase super(int) en la linea 9 antes de la sentencia System.out.println al igual que en la linea 13. Por ello hay error de compilación en el código de la pregunta 3.