Las clases estáticas internas no pueden acceder directamente a datos no estáticos de la clase externa, mientras que las clases internas no estáticas pueden acceder directamente a todos los datos de la clase externa, incluidos los privados. (A)
A. Correcto B. Incorrecto
En J2EE, para configurar un filtro de Servlet, se deben declarar los siguientes elementos en el archivo web.xml:
A. <filter> B. <filter-mapping>
C. <servlet-filter> D. <filter-config>
Respuesta correcta: AB
La configuración de un filtro de Servlet consta de dos partes. La primera, la definición del filtro en la aplicación web, se declara con el elemento <filter>, que requiere los subelementos <filter-name> y <filter-class>. La segunda, la definición del mapeo del filtro, se utiliza el elemento <filter-mapping> para asociar el filtro con uno o más Servlets o archivos JSP, o con patrones de URL específicos.
Conversión de tipos
/**
* Secuencia de conversión: short->int->long->float->double->
* */
public class ConversionDemo {
public static void main(String[] args) {
int valorEntero = 1;
int valorLargo = valorEntero;
short valorCorto = (short) valorEntero;
double valorDoble = valorEntero;
float valorFlotante = valorEntero;
float otroFlotante = (float) valorDoble;
double otroDoble = valorFlotante;
float desdeLargo = valorLargo;
long aLargoDesdeFlotante = (long) desdeLargo;
boolean bandera = true;
}
}
Arreglos bidimensionales
int[][] arreglo = new int[10][10];
int arreglo2[][] = new int[2][2];
int [][]arreglo3 = new int[2][2];
int[] arreglo4[] = new int[1][1];
¿Cuáles de las siguientes declaraciones son correctas para un arreglo bidimensional de enteros? (CD)
A. int a\[\]\[\]=new int\[\]\[\]
B. int b\[10\]\[10\]=new int\[\]\[\]
C. int c\[\]\[\]=new int\[10\]\[10\]
D. int \[\]d\[\]=new int\[10\]\[10\]
¿Cuál es el resultado de ejecución del siguiente programa Java? (A)
public class Tester {
public static void main(String[] args) {
Integer var1 = new Integer(1);
Integer var2 = var1;
doSomething(var2);
System.out.print(var1.intValue());
System.out.print(var1 == var2);
}
public static void doSomething(Integer integer) {
integer = new Integer(2);
}
}
A. 1true
B. 2true
C. 1false
D. 2false
Operaciones de cortocircuito
&& y ||: Estos operadores son de cortocircuito. Esto significa que si la primera condición determina el resultado, la segunda no se evalúa.
Dado el siguiente código:
public class SwitchTest {
public static void main(String[] args) {
System.out.println("valor=" + switchit(4));
}
public static int switchit(int x) {
int j = 1;
switch (x) {
case 1: j++;
case 2: j++;
case 3: j++;
case 4: j++;
case 5: j++;
default: j++;
}
return j + x;
}
}
¿Qué imprime la tercera línea? B
A. valor=6
B. valor=8
C. valor=3
D. valor=5
E. valor=4
Explicación: No hay sentencias break, por lo que la ejecución continúa desde case 4 hasta el final. j se incrementa tres veces hasta llegar a 4, y se devuelve 4 + 4 = 8.
¿Cuál de las siguientes afirmaciones sobre la compilación y ejecución de Java es incorrecta? A
A. Ejecutar "java Scut.class"
B. Ejecutar "java Scut"
C. Compilar el archivo Scut.java usando el comando "javac Scut.java" produce el archivo Scut.class
D. El comando java se ejecuta sobre el archivo Scut.class
Explicación: Para compilar se usa javac NombreClase.java y para ejecutar java NombreClase.
Se lanza una excepción AccessViolationException. ¿Cuál es el resultado de la siguiente ejecución? A
static void Main(string[] args) {
try {
throw new AccessViolationException();
Console.WriteLine("error1");
} catch (Exception e) {
Console.WriteLine("error2");
}
Console.WriteLine("error3");
}
A. error2
error3
B. error3
C. error2
D. error1
Explicación: Cuando el bloque catch captura la excepción, el código posterior a él continúa su ejecución normalmente.
¿Cuál es el resultado de la salida de este código? D
public class ZeroTest {
public static void main(String[] args) {
try {
int i = 100 / 0;
System.out.print(i);
} catch (Exception e) {
System.out.print(1);
throw new RuntimeException();
} finally {
System.out.print(2);
}
System.out.print(3);
}
}
A. 3
B. 123
C. 1
D. 12
Explicación: 1. La división por cero lanza una excepción. 2. El bloque catch la captura e imprime 1, pero luego lanza otra excepción. 3. Solo se ejecuta el bloque finally (imprime 2), el código después de catch no se alcanza.
3. Dado Base b = new Derived();, ¿cuál es la salida de b.methodOne()? (A)
public class Base {
public void methodOne() {
System.out.print("A");
methodTwo();
}
public void methodTwo() {
System.out.print("B");
}
}
public class Derived extends Base {
public void methodOne() {
super.methodOne();
System.out.print("C");
}
public void methodTwo() {
super.methodTwo();
System.out.print("D");
}
}
A. ABDC
B. AB
C. ABCD
D. ABC
Explicación: Siempre que un método sea sobreescrito por la subclase, se invocará la versión de la subclase (a menos que se llame explícitamente con super).
Clases internas
Clase interna de miembro:
/**
* Clase interna de miembro.
* Su acceso depende de la instancia de la clase externa.
* Puede ser modificada por public, private o protected.
*/
public class EjemploExterno {
private static String nombreClase = "ejemplo";
int edadClase = 30;
Interna interna = new Interna();
protected class Interna {
public void mostrar() {
String nombreLocal = "otro";
System.out.println(EjemploExterno.nombreClase);
System.out.println(nombreLocal);
System.out.println(edadClase);
}
}
public static void main(String[] args) {
EjemploExterno externo = new EjemploExterno();
externo.interna.mostrar();
}
}
Clase interna estática:
/**
* Clase interna estática.
* No puede acceder a variables de instancia no estáticas de la clase externa directamente.
* Se comporta como una clase independiente; no necesita una instancia de la externa para ser instanciada.
*/
public class Contenedor {
private static String nombreContenedor = "contenedor";
int valorContenedor = 50;
public Contenedor() {
System.out.println(nombreContenedor);
System.out.println(valorContenedor);
System.out.println(EstaticaInterna.campoEstatico);
EstaticaInterna estatica = new EstaticaInterna();
System.out.println(estatica.campoInstancia);
}
public static class EstaticaInterna {
private static String campoEstatico = "12345";
int campoInstancia = 10;
public void prueba() {
Contenedor ref = new Contenedor();
System.out.println(ref.valorContenedor);
String nombreLocal = "otro";
System.out.println(Contenedor.nombreContenedor);
System.out.println(nombreLocal);
// System.out.println(valorContenedor); // Error: no se puede acceder directamente
}
}
public static void main(String[] args) {
EstaticaInterna estatica = new EstaticaInterna();
estatica.prueba();
}
}
Clase interna anónima:
/**
* Clase interna anónima.
* 1. Es una clase sin nombre.
* 2. Debe heredar de una clase o implementar una interfaz, pero solo puede heredar de una clase.
*/
public class EjemploAnonima {
}
Clase interna local:
/**
* Clase interna local.
* 1. Se define dentro de un método de la clase externa y no es estática.
* 2. Puede acceder a todas las variables de la clase externa.
*/
public class ConLocal {
static String nombreGlobal = "global";
public void ejecutar() {
class Local {
void obtener() {
System.out.println(nombreGlobal);
}
}
Local local = new Local();
local.obtener();
}
public static void main(String[] args) {
ConLocal instancia = new ConLocal();
instancia.ejecutar();
}
}
Sobrescritura de métodos (Override)
Nombre del método igual, parámetros idénticos. El tipo de retorno de la subclase debe ser igual o subtipo del de la superclase. Las excepciones lanzadas por la subclase deben ser iguales o subconjunto de las de la superclase. El modificador de acceso de la subclase debe ser igual o menos restrictivo que el de la superclase.
En Java, ¿cuál operador solo se puede usar con tipos enteros? (C)
A. *
B. /
C. %
D. +
Explicación: El operador módulo (%) funciona con tipos enteros. Con operandos de punto flotante, el comportamiento puede ser diferente al esperado.
¿Cuáles de las siguientes operaciones hacen que un hilo libere sus recursos de bloqueo (lock)? BC
A. sleep()
B. wait()
C. join()
D. yield()
Explicación: 1. sleep suspende el hilo actual por un tiempo, pero no libera el bloqueo. 2. yield cede el CPU, pero no libera el bloqueo. 3. wait hace que el hilo espere y libere el bloqueo hasta que sea notificado. 4. join hace que el hilo actual espere a que termine otro hilo; internamente usa wait, por lo que libera el bloqueo.
¿Cuál es el resultado de la salida de este segmento de código? D
public class Test {
public static void main(String args[]) {
int x = -5;
int y = -12;
System.out.println(y % x);
}
}
A. -1
B. 2
C. 1
D. -2
Explicación: El resultado del operador % toma el signo del dividendo (el número a la izquierda).
El siguiente fragmento de código produce una salida correcta. ( ) A
public class CharToString {
public static void main(String[] args) {
char miChar = 'g';
String miStr = Character.toString(miChar);
System.out.println("String es: " + miStr);
miStr = String.valueOf(miChar);
System.out.println("String es: " + miStr);
}
}
A.
String es: g
String es: g
B.
String es: 103
String es: g
C.
String es: g
String es: 103
D.
String es: 103
String es: 103
Explicación: Character.toString() internamente invoca String.valueOf(). La conversión a int es lo que obtendría el valor numérico (103).
Tras ejecutar la función test(), ¿qué se imprime en pantalla? ( ) D
public class Test2 {
public void add(Byte b) {
b = b++;
}
public void test() {
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + "");
}
}
A. 127 127
B. 128 127
C. 129 128
D. Ninguna de las anteriores
Explicación: Los objetos Byte son inmutables. Las operaciones ++a o b++ crean nuevos objetos. Por lo tanto, los cambios dentro de add() no afectan a las variables originales. Además, al operar con byte en ++a, se produce un desbordamiento, resultando en -128.
Los usuarios no pueden invocar directamente métodos constructores; solo se pueden llamar mediante la palabra clave new. ( ) B
A. Correcto
B. Incorrecto
Explicación: Dentro de la misma clase, se pueden invocar otros constructores usando this(), que debe ser la primera sentencia. En una subclase, se puede invocar el constructor de la superclase con super(), también como primera sentencia. Además, es posible invocar constructores usando reflexión.
¿Qué comando permite obtener una imagen de la memoria de la JVM? B
A. jinfo
B. jmap
C. jhat
D. jstat
Explicación: 1. jps: Lista procesos Java. 2. jstack: Imprime información de la pila de hilos. 3. jmap: Genera volcados de memoria del heap. 4. jstat: Monitor de rendimiento. 5. jhat: Herramienta de análisis de volcados de memoria. 6. jconsole: Consola gráfica simple. 7. jvisualvm: Consola avanzada.
En el siguiente fragmento de código, ¿qué sentencias contienen errores de compilación? ( ) BCD
byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7;
b3=(b1+b2); /*sentencia1*/
b6=b4+b5; /*sentencia2*/
b8=(b1+b4); /*sentencia3*/
b7=(b2+b5); /*sentencia4*/
System.out.println(b3+b6);
A. sentencia2
B. sentencia1
C. sentencia3
D. sentencia4
Explicación: En Java, las operaciones con byte, short y char se promueven a int. Asignar el resultado (un int) a una variable byte requiere un casteo explícito. Sin embargo, las variables final (b4, b5) mantienen su tipo byte en la operación, por lo que b4+b5 sigue siendo un byte.
Características de Java 7: ¿Cuál es la diferencia entre una clase abstracta y una interfaz? ABD
A. Una clase abstracta puede tener constructores; una interfaz no puede.
B. Una clase abstracta puede tener variables miembro no estáticas; una interfaz no puede.
C. Una clase abstracta no puede contener métodos estáticos; una interfaz sí puede.
D. Una clase puede implementar múltiples interfaces, pero solo puede heredar de una clase abstracta.
El permiso de acceso protected es menos restrictivo que el acceso de paquete (default). ( ) B
A. Correcto
B. Incorrecto
Explicación: La jerarquía es: public > protected > default (acceso de paquete) > private.
De las siguientes afirmaciones, ¿cuáles son verdaderas?
Integer i = 42;
Long l = 42l;
Double d = 42.0;
A. (i == l)
B. (i == d)
C. (l == d)
D. i.equals(d)
E. d.equals(l)
F. i.equals(l)
G. l.equals(42L)
Explicación: Las comparaciones == (A, B, C) entre tipos diferentes causan errores de compilación. Los métodos equals (D, E, F) primero comparan tipos y, al ser diferentes, devuelven false. G es verdadero porque 42L se auto-empaqueta a Long y tiene el mismo valor.
¿Cuál es el resultado de la salida del siguiente código? D
public class Test {
public int aMethod() {
static int i = 0; // Error de compilación
i++;
return i;
}
public static void main(String args[]) {
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}
A. 0
B. 1
C. 2
D. Fallo en la compilación
Explicación: Las variables static solo pueden definirse a nivel de clase, no dentro de métodos.
¿Cuál de las siguientes afirmaciones sobre HashMap en Java es incorrecta? C
A. El rendimiento de una instancia de HashMap se ve afectado por dos parámetros: "capacidad inicial" y "factor de carga".
B. La implementación de HashMap no es síncrona, lo que significa que no es segura para hilos.
C. HashMap resuelve colisiones de hash mediante direccionamiento abierto.
D. Las entradas clave-valor en HashMap se almacenan en un arreglo de tipo Entry.
Explicación: HashMap utiliza el método de encadenamiento (listas enlazadas) para resolver colisiones.
El orden de ejecución en Java involucrando herencia es: 1. Bloques estáticos de la superclase. 2. Bloques estáticos de la subclase. 3. Bloques de inicialización de la superclase y su constructor. 4. Bloques de inicialización de la subclase y su constructor.
Las clases StringBuilder, StringBuffer y String son todas finales.
¿Cuál es el resultado de la ejecución del siguiente código? B
public class Demo {
public static void main(String[] args) {
System.out.print(getNumber(0));
System.out.print(getNumber(1));
System.out.print(getNumber(2));
System.out.print(getNumber(4));
}
public static int getNumber(int num) {
try {
int result = 2 / num;
return result;
} catch (Exception exception) {
return 0;
} finally {
if (num == 0) {
return -1;
}
if (num == 1) {
return 1;
}
}
}
}
A. 0110
B. -1110
C. 0211
D. -1211
Explicación: Una sentencia return dentro del bloque finally anula cualquier return anterior en los bloques try o catch.
¿Cuál es la salida de las siguientes tres sentencias? ( ) D
System.out.println("is " + 100 + 5);
System.out.println(100 + 5 + " is");
System.out.println("is " + (100 + 5));
A. is 1005, 1005 is, is 1005
B. is 105, 105 is, is 105
C. is 1005, 1005 is, is 105
D. is 1005, 105 is, is 105
Explicación: La concatenación con String ocurre de izquierda a derecha. Si un String aparece primero, los números se convierten a String y se concatenan. Los operadores aritméticos tienen mayor precedencia que la concatenación.
Resumen de clases abstractas e interfaces: Ambas no pueden ser instanciadas.
Clase abstracta:
1. Puede implementar interfaces.
2. Si un método es abstracto, la clase debe serlo.
3. Los métodos abstractos deben ser implementados por subclases no abstractas.
4. No pueden ser private, static, synchronized o native.
Interfaz:
1. Solo contiene declaraciones de métodos (sin cuerpo).
2. Solo puede contener constantes (public static final).
3. Los métodos son siempre public.
4. No tiene constructores.
5. Puede heredar de múltiples interfaces, pero no de clases.
¿Cuál es el resultado de la salida del siguiente programa Java? ( ) D
public static void main(String[] args) {
Object o1 = true ? new Integer(1) : new Double(2.0);
Object o2;
if (true) {
o2 = new Integer(1);
} else {
o2 = new Double(2.0);
}
System.out.print(o1);
System.out.print(" ");
System.out.print(o2);
}
A. 1 1
B. 1.0 1.0
C. 1 1.0
D. 1.0 1
Explicación: En el operador ternario, el tipo resultante se promueve al más general. Aquí, Integer se promueve a Double, por lo que o1 es 1.0.
public class Test {
public int x;
public static void main(String []args) {
System.out.println("Value is" + x);
}
}
Para el código anterior, ¿cuál es la afirmación correcta? C
A. El programa imprime "Value is 0"
B. El programa lanza NullPointerException
C. Una variable no estática no puede ser referenciada desde un método estático
D. El compilador lanza "possible reference before assignment"
Dado el siguiente segmento de código, ¿cuál es la afirmación correcta? C
public class Padre {
private void m1(){}
void m2(){}
protected void m3(){}
public static void m4(){}
}
A. Una subclase puede heredar y sobreescribir el método m1 de Padre.
B. Una subclase puede heredar y sobreescribir el método m2 de Padre.
C. Una subclase puede heredar y sobreescribir el método m3 de Padre.
D. Una subclase puede heredar y sobreescribir el método m4 de Padre.
Explicación: Los métodos estáticos no se heredan; se inicializan durante la carga de la clase.
Resumen de Hashtable y HashMap:
Hashtable es una tabla hash sincronizada (segura para hilos) y no permite claves ni valores null.
HashMap no es síncrono, usa un arreglo de listas enlazadas, y permite claves y valores null.
La expresión matemática |x| < 10 corresponde a la siguiente expresión Java. B
A. |x|<10
B. x<10 && x>-10
C. x<10 || x>-10
D. 10>x>-10
Si una interfaz Cow tiene un método drink() y una clase Calf la implementa, ¿cuál es la declaración correcta en Calf? ( ) C
A. void drink() { …}
B. protected void drink() { …}
C. public void drink() { …}
D. Todas las anteriores son válidas en Calf.
Explicación: Al sobreescribir un método, el modificador de acceso no puede ser más restrictivo. Dado que los métodos de interfaz son public por defecto, la implementación debe ser public.
Acerca de los arreglos en Java, ¿cuáles de las siguientes descripciones son precisas? ( ) ACF
A. Un arreglo es un objeto; diferentes tipos de arreglos tienen diferentes clases.
B. La longitud de un arreglo se puede ajustar dinámicamente.
C. Un arreglo es una estructura de almacenamiento contiguo.
D. Un arreglo de longitud fija se puede definir así: int array\[100\].
E. Para comparar dos arreglos, se usa el método equals, que compara elemento a elemento.
F. Se pueden crear arreglos bidimensionales y multidimensionales, lo cual es legal en Java.
Explicación: Los arreglos tienen longitud fija. Para compararlos, se debe usar Arrays.equals().
¿Cuál de las siguientes afirmaciones sobre el manejo de excepciones es incorrecta? D
A. Las excepciones en tiempo de ejecución son manejadas automáticamente por la JVM.
B. Se puede usar una sentencia try-catch-finally para capturar excepciones.
C. Se puede usar la sentencia throw para lanzar una excepción.
D. Una excepción capturada solo puede manejarse en el método actual; no se puede lanzar a otros métodos.
Explicación: Una excepción puede manejarse en el método actual o relanzarse.
¿Cuál es el resultado de ejecutar el siguiente código? C
public static void main(String[] args) {
String s;
System.out.println("s=" + s);
}
A. Compila e imprime "s=".
B. Compila e imprime "s=null".
C. No compila porque String s no está inicializada.
D. Compila, pero lanza NullPointerException.
Explicación: Las variables locales deben ser inicializadas antes de usarlas.
¿Cuál es el resultado de la ejecución del siguiente programa? B
public class Example {
String str = new String("good");
char[] ch = {'a', 'b', 'c'};
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}
A. good and abc
B. good and gbc
C. test ok and abc
D. test ok and gbc
Explicación: Las cadenas (String) son inmutables. La reasignación dentro de change no afecta a la cadena original. Los arreglos son mutables, por lo que cambiar un elemento sí afecta al arrreglo original.
¿Cuál es el resultado de la ejecución del siguiente código? B
public class Test {
public static int a = 1;
public static void main(String[] args) {
int a = 10;
a++;
Test.a++;
Test t = new Test();
System.out.println("a=" + a + " t.a=" + t.a);
}
}
A. a=10 t.a=3
B. a=11 t.a=2
C. a=12 t.a=1
D. a=11 t.a=1
Desde JDK 1.5, ¿cuál es la salida del siguiente programa Java? B
int i = 0;
Integer j = new Integer(0);
System.out.println(i == j);
System.out.println(j.equals(i));
A. true, false
B. true, true
C. false, true
D. false, false
Explicación: 1. Cuando se compara un tipo primitivo con un objeto Integer, el objeto se desempaqueta y se comparan valores. 2. equals compara valores después del auto-empaquetado.
Para que una clase hija invoque el constructor de su clase base, se debe usar la palabra clave: ( ) C
A. this
B. final
C. super
D. static
¿En cuál de los siguientes paquetes de Java se almacenan las funciones básicas del lenguaje? ( ) A
A. java.lang
B. java.io
C. java.net
D. java.util
¿Cuáles de los siguientes fragmentos de código se ejecutan correctamente? CD
A.
public static void main(String args[]) {
byte a = 3;
byte b = 2;
b = a + b;
System.out.println(b);
}
B.
public static void main(String args[]) {
byte a = 127;
byte b = 126;
b = a + b;
System.out.println(b);
}
C.
public static void main(String args[]) {
byte a = 3;
byte b = 2;
a += b;
System.out.println(b);
}
D.
public static void main(String args[]) {
byte a = 127;
byte b = 127;
a += b;
System.out.println(b);
}
¿Cuáles de los siguientes recolectores de basura de la JVM usan el algoritmo de recolección por copia? AD
A. Recolector serial para la generación joven
B. Recolector serial para la generación vieja
C. Recolector paralelo
D. Recolector paralelo de recuperación para la generación joven
E. Recolector paralelo de recuperación para la generación vieja
F. Recolector CMS
Explicación: Los recolectores para la generación joven (Serial New, Parallel New, Parallel Scavenge) usan el algoritmo de copia. Los de la generación vieja usan marcar-compactar o marcar-barrer.
Suponga que a es una variable global inicializada a 0, compartida por el hilo 1 y el hilo 2. Si ambos hilos ejecutan el siguiente código simultáneamente, ¿cuál NO es un resultado posible para a? ( ) D
boolean isOdd = false;
for (int i = 1; i <= 2; ++i) {
if (i % 2 == 1) isOdd = true;
else isOdd = false;
a += i * (isOdd ? 1 : -1);
}
A. -1
B. -2
C. 0
D. 1
Explicación: Cada hilo realiza operaciones de incremento (i=1) y decremento (i=2). Dependiendo de la interleaving, el resultado puede ser -2, -3, 0 o -1, pero nunca 1.
¿En cuáles de los siguientes casos la clase debe ser necesariamente abstracta? ABD
A. Cuando uno o más métodos de la clase son abstractos.
B. Cuando la clase es subclase de una clase abstracta y no puede proporcionar implementación para ningún método abstracto.
C. Cuando una clase implementa múltiples interfaces.
D. Cuando una clase implementa una interfaz y no puede proporcionar implementación para ningún método abstracto.
¿Cuáles de las siguientes afirmaciones son correctas? ( ) BC
public class Test {
public static class A {
private B ref;
public void setB(B b) {
ref = b;
}
}
public static class B {
private A ref;
public void setA(A a) {
ref = a;
}
}
public static void main(String args[]) {
start();
}
public static void start() {
A a = new A();
B b = new B();
a.setB(b);
b = null; //
a = null;
}
}
A. Después de b = null, el objeto b puede ser recolectado por el GC.
B. Después de a = null, el objeto b puede ser recolectado por el GC.
C. Después de a = null, el objeto a puede ser recolectado por el GC.
D. a y b solo pueden ser recolectados después de que termine todo el programa.
E. Las clases A y B tienen una referencia circular en su diseño, lo que causa una fuga de memoria.
F. a y b solo pueden ser recolectados después de que el método start termine.
Explicación: Cuando b = null, el objeto B todavía está referenciado por A. Cuando a = null, tanto A como B pierden todas sus referencias y pueden ser recolectados.
¿Cuál de las siguientes declaraciones de campo es legal dentro del cuerpo de una interfaz? ( ) C
A. private final static int answer = 42;
B. public static int answer = 42;
C. final static answer = 42;
D. int answer;
Explicación: En una interfaz, los campos son implícitamente public static final. Por lo tanto: A es ilegal (private). B es legal (permite omitir los modificadores). C es ilegal (falta el tipo de dato). D es ilegal (los campos final deben ser inicializados).
¿Cuáles de las siguientes afirmaciones son correctas sobre el siguiente código? AD
public static void main(String[] args) {
String a = new String("myString");
String b = "myString";
String c = "my" + "String";
String d = c;
System.out.print(a == b);
System.out.print(a == c);
System.out.print(b == c);
System.out.print(b == d);
}
A. System.out.print(a == b) imprime false.
B. System.out.print(a == c) imprime true.
C. System.out.print(b == c) imprime false.
D. System.out.print(b == d) imprime true.
Explicación: a apunta al heap, b apunta al pool de constantes. c es una concatenación de literales, por lo que también apunta al pool de constantes (misma dirección que b). d es una referencia al mismo objeto que c.
Math.floor(-8.5) es igual a ( ) D
A. (float)-8.0
B. (long)-9
C. (long)-8
D. (double)-9.0
Explicación: Math.floor() redondea hacia abajo y devuelve un double.
¿Cuál de los siguientes NO es un operador de asignación?
A. +=
B. <<=
C. <<<=
D. >>>=
¿Cuál es la salida de la siguiente ejecución? B
public class EqualsMethod {
public static void main(String[] args) {
Integer n1 = new Integer(47);
Integer n2 = new Integer(47);
System.out.print(n1 == n2);
System.out.print(",");
System.out.println(n1 != n2);
}
}
A. false, false
B. false, true
C. true, false
D. true, true
¿Cuál de las siguientes afirmaciones sobre la recolección de basura es correcta? D
A. Un objeto se recolecta inmediatamente cuando se convierte en basura.
B. El método finalize de un objeto se ejecuta después de que su espacio es recolectado.
C. El método finalize es exactamente igual que el destructor en C++.
D. Un objeto se convierte en basura porque ya no tiene referencias apuntando a él, pero un hilo no es un objeto.
Dado el siguiente código, ¿cuál es el resultado de su ejecución? ( ) C
public class StringDemo {
private static final String MESSAGE = "taobao";
public static void main(String[] args) {
String a = "tao" + "bao";
String b = "tao";
String c = "bao";
System.out.println(a == MESSAGE);
System.out.println((b + c) == MESSAGE);
}
}
A. true true
B. false false
C. true false
D. false true
Explicación: a es una concatenación de literales, por lo que se evalúa en tiempo de compilación y apunta al mismo objeto en el pool de constantes que MESSAGE. b + c se evalúa en tiempo de ejecución y crea un nuevo objeto String en el heap.
¿Cuál de las siguientes afirmaciones sobre permisos de acceso es correcta? ( ) D
A. Una clase externa puede ser modificada por public, protected y private.
B. Una clase interna local puede ser modificada por public, protected y private.
C. Una clase interna anónima puede ser modificada por public, protected y private.
D. Ninguna de las anteriores es correcta.
Explicación: Las clases externas solo pueden ser public o default. Las clases internas locales y anónimas no pueden ser modificadas por public, protected o private.
¿Cuál es el resultado de la ejecución del siguiente código? A
class Valor {
public int i = 15;
}
public class Test {
public static void main(String argv[]) {
Test t = new Test();
t.first();
}
public void first() {
int i = 5;
Valor v = new Valor();
v.i = 25;
second(v, i);
System.out.println(v.i);
}
public void second(Valor v, int i) {
i = 0;
v.i = 20;
Valor val = new Valor();
v = val;
System.out.println(v.i + " " + i);
}
}
A. 15 0 20
B. 15 0 15
C. 20 0 20
D. 0 15 20
Explicación: Java pasa argumentos por valor. Para objetos, el valor es una referencia. Al reasignar v dentro de second, no se afecta a la referencia original. Sin embargo, modificar un campo del objeto sí afecta.
¿Cuál es el resultado de la ejecución del siguiente código? ( ) C
public class Arraytest {
int a[] = new int[6];
public static void main(String arg[]) {
System.out.println(a[0]);
}
}
A. null
B. 0
C. Error de compilación
D. Error en tiempo de ejecución
Explicación: Un método estático no puede acceder a una variable de instancia no estática.
¿Cuál es el resultado de la salida del siguiente código? C
int i = 5;
int j = 10;
System.out.println(i + ~j);
A. Error de compilación porque "~" no opera sobre enteros.
B. -5
C. -6
D. 15
Explicación: ~j es el complemento a uno de j (-11). La fórmula es -n = ~n + 1. Por lo tanto, 5 + (-11) = -6.
¿Cuál es la salida en pantalla de la compilación y ejecución del siguiente programa? ( ) A
public class Test {
public static void main(String args[]) {
int x, y;
x = 5 >> 2;
y = x >>> 2;
System.out.println(y);
}
}
A. 0
B. 2
C. 5
D. 80
Explicación: 5 >> 2 es 1 (desplazamiento a la derecha con signo). 1 >>> 2 es 0 (desplazamiento a la derecha lógico, llenando con ceros).
¿Cuáles de las siguientes afirmaciones sobre la palabra clave final son incorrectas? AC
A. final es un modificador en Java que puede modificar clases, interfaces, clases abstractas, métodos y atributos.
B. Una clase marcada como final no puede ser heredada.
C. Un método marcado como final no puede ser sobrecargado.
D. Una variable marcada como final no puede ser reasignada.
Explicación: Un método final puede ser sobrecargado (Overload), pero no puede ser sobreescrito (Override).
¿Cuál es el resultado de la ejecución del siguiente código? D
public class Test {
public int add(int a, int b) {
try {
System.out.println("bloque try");
return a + b;
} catch (Exception e) {
System.out.println("bloque catch");
} finally {
System.out.println("bloque finally");
}
return 0;
}
public static void main(String argv[]) {
Test test = new Test();
System.out.println("Suma es: " + test.add(9, 34));
}
}
A. bloque try Suma es: 43
B. Excepción en compilación
C. bloque final Suma es: 43
D. Suma es: 43 bloque finally
Explicación: No hay excepción. El orden de ejecución es: bloque try -> bloque finally -> retorno del valor.
Después de ejecutar las siguientes sentencias, ¿cuál es el valor de b? ( ) C
String a = "Hello";
String b = a.substring(0, 2);
A. Hello
B. Hel
C. He
D. null
Explicación: substring(inicio, fin) devuelve la cadena desde el índice inicio hasta fin - 1.
Para importar todas las clases de java/awt/event, ¿cuál es la afirmación correcta? ( ) C
A. Tanto import java.awt.\* como import java.awt.event.\* son correctas.
B. Solo import java.awt.\* es correcta.
C. Solo import java.awt.event.\* es correcta.
D. Ni import java.awt.\* ni import java.awt.event.\* son correctas.
¿Cuál es el tipo del resultado de la expresión (short)10/10.2*2? ( ) C
A. short
B. int
C. double
D. float
Explicación: El casteo (short)10 convierte el 10 a short. Luego, al dividir por 10.2 (un double), el resultado se promueve a double.
¿Cuál es la salida del siguiente código Java? B
public static void main(String args[]) {
System.out.println(14 ^ 3);
}
A. 2744
B. 13
C. 17
D. 11
Explicación: ^ es el operador XOR. En binario: 14 es 1110, 3 es 0011. 1110 XOR 0011 = 1101, que es 13 en decimal.
¿Cuál es el resultado de la ejecución del siguiente código? D
String str1 = "hello";
String str2 = "he" + new String("llo");
System.out.println(str1 == str2);
A. true
B. Ninguna de las anteriores
C. null
D. false
Explicación: str1 apunta al pool de constantes. str2 se crea en el heap porque involucra una operación con new String() en tiempo de ejecución.
¿Cuál es el resultado de la salida del siguiente código? D
class Animal {
public void move() {
System.out.println("El animal puede moverse");
}
}
class Perro extends Animal {
public void move() {
System.out.println("El perro puede correr y caminar");
}
public void ladrar() {
System.out.println("El perro puede ladrar");
}
}
public class TestPerro {
public static void main(String args[]) {
Animal a = new Animal();
Animal b = new Perro();
a.move();
b.move();
b.ladrar(); // Error de compilación
}
}
A.
El animal puede moverse
El perro puede correr y caminar
El perro puede ladrar
B.
El animal puede moverse
El animal puede moverse
El perro puede ladrar
C. Error en tiempo de ejecución
D. Error de compilación
Explicación: La compilación se hace según el tipo de referencia (izquierda), la ejecución según el tipo real del objeto (derecha). b es de tipo Animal, que no tiene el método ladrar().
¿Cuál es la diferencia entre final, finally y finalize? ( ) ABC
A. final es un modificador de palabra clave que puede modificar clases, métodos y variables.
B. finally se usa en el manejo de excepciones; proporciona un bloque que se ejecuta siempre para operaciones de limpieza.
C. finalize es el nombre de un método que se invoca por el recolector de basura antes de que un objeto sea eliminado de la memoria.
D. finally y finalize son ambos métodos utilizados en el manejo de excepciones.
Considerando el siguiente código, ¿cuál es la descripción correcta de la sentencia test.hello()? ( ) A
package NowCoder;
class Test {
public static void hello() {
System.out.println("hello");
}
}
public class MyApplication {
public static void main(String[] args) {
Test test = null;
test.hello();
}
}
A. Compila y se ejecuta correctamente.
B. No compila porque se usa una variable no inicializada.
C. Se usa una forma incorrecta de acceder a un método estático.
D. Compila, pero falla en tiempo de ejecución porque la variable es null.
Explicación: Los métodos estáticos se asocian con la clase, no con una instancia. Por lo tanto, no se requiere una instancia para invocarlos.
Si una interfaz Cup tiene un método use(), y una clase SmallCup la implementa, ¿cuál es la declaración correcta en SmallCup? ( ) C
A. void use() { …}
B. protected void use() { …}
C. public void use() { …}
D. Todas las anteriores son válidas en SmallCup.
Explicación: Al implementar una interfaz, los métodos deben ser public.
En Java, si la clase A tiene un constructor A(int a), ¿cuál es el formato correcto para llamar a ese constructor desde otro constructor dentro de la misma clase? ( ) B
A. this.A(x)
B. this(x)
C. super(x)
D. A(x)
Explicación: this() llama a otro constructor de la misma clase. super() llama al constructor de la superclase.
¿Cuál de las siguientes afirmaciones es correcta? ( ) C
A. Tanto volatile como synchronized pueden modificar variables, métodos y bloques de código.
B. Tanto volatile como synchronized pueden causar bloqueos en multihilo.
C. volatile garantiza la visibilidad de los datos pero no su atomicidad; synchronized garantiza ambas.
D. volatile resuelve la visibilidad y atomicidad de una variable entre múltiples hilos, mientras que synchronized resuelve la sincronización del acceso a recursos.
En el siguiente código Java, ¿en qué áreas de memoria se almacenan las variables a, b y c? ( ) C
class A {
private String a = "aa";
public boolean methodB() {
String b = "bb";
final String c = "cc";
}
}
A. Heap, Heap, Heap
B. Heap, Stack, Heap
C. Heap, Stack, Stack
D. Heap, Heap, Stack
E. Área estática, Stack, Heap
F. Área estática, Stack, Stack
¿Cuál es la salida del siguiente programa? B
public class TestDemo {
public static String output = "";
public static void foo(int i) {
try {
if (i == 1) {
throw new Exception();
}
} catch (Exception e) {
output += "2";
return;
} finally {
output += "3";
}
output += "4";
}
public static void main(String[] args) {
foo(0);
foo(1);
System.out.println(output);
}
}
A. 342
B. 3423
C. 34234
D. 323
Explicación: Para foo(0): no hay excepción, se ejecuta try, finally (añade "3") y luego se añade "4". Para foo(1): se lanza excepción, se ejecuta catch (añade "2"), finally (añade "3"), y se hace return antes de añadir "4".
¿Cuántas veces se ejecuta la sentencia 3 en el siguiente segmento de código (donde n > 1)? ( ) C
for (i = 0; i <= n - 1; i++) // (1)
for (j = n; j > i; j--) // (2)
state; // (3)
A. n(n+2)/2
B. (n-1)(n+2)/2
C. n(n+1)/2
D. (n-1)(n+2)
Explicación: Es la suma de los primeros n enteros: n + (n-1) + ... + 1 = n(n+1)/2.
En la siguiente sentencia switch, ¿qué tipos de datos puede ser x? ( ) BDF
switch (x) {
default:
System.out.println("Hello");
}
A. long
B. char
C. float
D. byte
E. double
F. String
Explicación: Desde Java 7, switch soporta byte, short, char, int, sus respectivas clases envolventes, enum y String.
¿Cuál de las siguientes afirmaciones es correcta? ( ) AC
A. Una clase no puede heredar de múltiples clases, pero una interfaz puede extender múltiples interfaces.
B. Una clase abstracta puede definir miembros, pero una interfaz no puede.
C. Ni una clase abstracta ni una interfaz pueden ser instanciadas.
D. Una clase puede tener múltiples superclases directas y múltiples interfaces base.
¿Cuál es el resultado de la ejecución del siguiente código? B
public class B {
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("bloque de inicialización");
}
static {
System.out.println("bloque estático");
}
public static void main(String[] args) {
B t = new B();
}
}
A. bloque estático bloque de inicialización bloque de inicialización bloque de inicialización
B. bloque de inicialización bloque estático bloque de inicialización bloque de inicialización
C. bloque de inicialización bloque de inicialización bloque estático bloque de inicialización
D. bloque de inicialización bloque de inicialización bloque de inicialización bloque estático
Explicación: La memoria para las variables estáticas se asigna cuando se asigna valor. Los bloques de inicialización se ejecutan antes del constructer.
Los siguientes son seguros para hilos (thread-safe): Vector, Hashtable. No son seguros: HashMap, TreeMap.
¿Cuál es el resultado de la ejecución del siguiente código? C
class X {
Y y = new Y();
public X() {
System.out.print("X");
}
}
class Y {
public Y() {
System.out.print("Y");
}
}
public class Z extends X {
Y y = new Y();
public Z() {
System.out.print("Z");
}
public static void main(String[] args) {
new Z();
}
}
A. ZYXX
B. ZYXY
C. YXYZ
D. XYZX
Explicación: El orden de inicialización es: 1. Miembros estáticos de la superclase. 2. Miembros estáticos de la subclase. 3. Miembros de instancia y constructor de la superclase. 4. Miembros de instancia y constructor de la subclase.
Dado el siguiente código, para que el campo data de la clase Child obtenga el valor 10, ¿qué se debe escribir en el espacio en blanco del constructor de Child? ( ) D
class Parent {
private int data;
public Parent(int d) {
data = d;
}
}
class Child extends Parent {
String name;
public Child(String s, int d) {
_________________
name = s;
}
}
A. data = d;
B. super.data = d;
C. Parent(d);
D. super(d);
Explicación: Se debe invocar al constructor de la superclase con super(d). No se puede acceder a campos private directamente con super.campo.
¿Cuál es el resultado de la ejecución del siguiente código? B
int num = 100;
int count = 1000;
for (int i = 0; i < count; i++) {
num = num * (i % 2 == 0 ? 1 : -1);
}
System.out.println("num * count = " + num * count);
A. num * count = 505000
B. num * count = 0
C. Error en tiempo de ejecución
D. num * count = 5050
¿Cuál de las siguientes definiciones de interfaz es correcta? ( ) D
A. interface B { void print() { } ;}
B. interface B { static void print() ;}
C. abstract interface B extends A1, A2 //A1、A2 son interfaces ya definidas { abstract void print(){ };}
D. interface B { void print();}
Explicación: En una interfaz, los métodos son implícitamente public y abstract. No pueden tener cuerpo (excepto métodos default o static desde Java 8). No pueden ser final.
¿Cuál es el resultado de la ejecución del siguiente programa? B
public class Example {
String str = new String("tarena");
char[] ch = {'a', 'b', 'c'};
public static void main(String args[]) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.print(ex.str + " and ");
System.out.print(ex.ch);
}
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
}
}
A. tarena and abc
B. tarena and gbc
C. test ok and abc
D. test ok and gbc
Explicación: Las cadenas (String) son inmutables. La reasignación dentro de change no afecta a la cadena original. Los arreglos son mutables, por lo que cambiar un elemento sí afecta al arreglo original.
Después de un bloque try debe haber obligatoriamente un bloque catch. ( ) B
A. Correcto
B. Incorrecto
Explicación: Las formas válidas son: try-catch, try-finally, try-catch-finally. No se pueden omitir tanto catch como finally.
Las siguientes estructuras son adecuadas para escenarios con muchas lecturas y pocas escrituras: CopyOnWriteArrayList, ReadWriteLock.
¿Cuál de los siguientes NO es parte del proceso de carga de clases en Java? B
A. Generar el objeto java.lang.Class.
B. Asignar valores predeterminados a los miembros de tipo int en un objeto.
C. Ejecutar bloques static.
D. Resolución de métodos de la clase.
Explicación: La asignación de valores por defecto a los campos de instancia ocurre durante la instanciación de objetos, no durante la carga de clases.
Dado int x=1, float y=2, ¿cuál es el valor de la expresión x/y? ( ) D
A. 0
B. 1
C. 2
D. Ninguna de las anteriores
Explicación: x se promueve a float. 1.0f / 2.0f = 0.5f. Esto no coincide con las opciones A, B o C.
¿Cuáles de las siguientes interfaces heredan directamente de la interfaz Collection? ( ) AC
A. List
B. Map
C. Set
D. Iterator
¿Cuál de los siguientes códigos (A, B, C, D) insertados en el lugar marcado 【代码】 causaría un error de compilación? B
class A {
public float getNum() {
return 3.0f;
}
}
public class B extends A {
【代码】
}
A. public float getNum(){return 4.0f;}
B. public void getNum(){}
C. public void getNum(double d){}
D. public double getNum(float d){return 4.0d;}
Explicación: La opción B cambia el tipo de retorno de float a void, lo que viola las reglas de sobrescritura.
¿Cuáles de las siguientes operaciones hacen que un hilo libere sus recursos de bloqueo (lock)? BC
A. sleep()
B. wait()
C. join()
D. yield()
Explicación: wait() y join() (que internamente usa wait()) liberan el bloqueo. sleep() y yield() no lo hacen.
Dado el siguiente segmento de código, ¿cuál es la afirmación correcta? ( ) C
public class Padre {
private void m1(){}
void m2(){}
protected void m3(){}
public static void m4(){}
}
A. Una subclase puede heredar y sobreescribir el método m1 de Padre.
B. Una subclase puede heredar y sobreescribir el método m2 de Padre.
C. Una subclase puede heredar y sobreescribir el método m3 de Padre.
D. Una subclase puede heredar y sobreescribir el método m4 de Padre.
Explicación: Los métodos estáticos no se heredan; se inicializan durante la carga de la clase.