Photo by on Unsplash
Hace
aproximadamente 6 años escribí un artículo, en el cual compilé una selección de las preguntas más comunes en las entrevistas técnicas de Java.
Escribí dicho artículo en base a mi experiencia al buscar empleo como
desarrollador de Java Senior.
Ahora estoy
del otro lado de la mesa. Soy líder de un equipo de desarrollo de software.
Aparte de liderar el desarrollo de software, tengo a mi cargo también la
contratación de nuevos colegas para que trabajen conmigo, en mi equipo. De esta
manera, tengo la experiencia de entrevistar y el privilegio de contratar a los
programadores más expertos. De igual manera, las posibles preguntas de la
entrevista técnica de Java son muy familiares para mí.
En este
artículo te comparto una lista de preguntas que te servirán como preparación
para tu entrevista de Java. La lista ha sido actualizada para el 2025, para
considerar los avances en las tecnologías (Java, SQL, docker, etc) en los
últimos años. La lista cuenta también con todas las respuestas, así que la
puedes utilizar como material completo para tu entrevista. Aprovéchala y muchos
éxitos en tu búsqueda laboral.
CONOCIMIENTOS GENERALES SOBRE PROGRAMACIÓN
1. ¿Qué es una clase? ¿Qué es un
objeto? ¿Cuál es la diferencia entre ellos?
- Clase: Una clase es una
abstracción de objetos reales. Es un arquetipo, un modelo, un plano que
sirve como base para construir diferentes objetos y contiene la definición
de varios atributos, métodos o acciones que son comunes para cada objeto.
- Objeto: Es una instancia
específica de una clase. Tiene valores específicos para cada atributo.
2. ¿Qué es el encapsulamiento?
El
encapsulamiento significa que todos los valores de los atributos de un objeto
específico están envueltos dentro del objeto y, por lo tanto, no son accesibles
para objetos externos. El objetivo es asegurarse de que los datos
"sensibles" estén ocultos a los usuarios. Esto se logra declarando
los atributos como privados. Para permitir el acceso, se utiliza a través de
métodos get/set.
Razones:
- Mejor control de los atributos
y métodos de la clase.
- Las variables de clase pueden
hacerse de solo lectura (si omites el método set) o de solo escritura (si
omites el método get).
- Flexible: el programador puede
cambiar una parte del código sin afectar otras partes.
- Mayor seguridad de los datos.
Fuente: W3schools
3. ¿Qué es el polimorfismo?
El polimorfismo
en programación es un principio fundamental de la programación orientada a
objetos (OOP) que permite que una misma interfaz o método se comporte de
diferentes maneras según el objeto que lo implemente o invoque.
El
polimorfismo permite que un mismo método o función pueda tener diferentes
comportamientos dependiendo del tipo de objeto que lo esté
utilizando.
Tipos de polimorfismo
- Polimorfismo en tiempo de compilación (sobrecarga): Ocurre cuando existen varios métodos con el mismo nombre pero diferente número o tipo de parámetros en la misma clase. Ejemplo en Java:
int sumar(int a, int b) { return a + b; }
double sumar(double a, double b) { return a + b; }
}
- Polimorfismo en tiempo de ejecución (sobreescritura): Ocurre cuando una subclase redefine un método heredado de la clase padre para que tenga un comportamiento diferente. Ejemplo en Java:
void hacerSonido() {
System.out.println("Algún sonido...");
}
}
class Perro extends Animal {
void hacerSonido() {
System.out.println("Guau guau");
}
}
class Gato extends Animal {
void hacerSonido() {
System.out.println("Miau");
}
}
public class Test {
public static void main(String[] args) {
Animal miAnimal = new Perro();
miAnimal.hacerSonido(); // Imprime "Guau guau"
}
}
PREGUNTAS SOBRE JAVA
4. ¿Qué es una clase abstracta?
Una clase abstracta es una clase que no puede ser instanciada. Generalmente, sirve como un supermodelo para otras clases que heredan sus atributos y métodos. Proporciona una interfaz común que permite que las subclases se intercambien con todas las demás subclases.
5. ¿Para qué se utiliza la
palabra clave final?
La palabra
clave final
se utiliza para indicar que ciertos
elementos no sufrirán más cambios. Puede aplicarse a una variable, un método o
una clase. En cada caso, indica algo ligeramente diferente:
- Variable final: El valor
de la variable no cambiará; es decir, es una constante.
- Método final: El método
no puede ser sobrescrito por las subclases.
- Clase final: La clase
no puede ser heredada; es decir, no puede tener subclases.
Fuente: Javatpoint
6. ¿Qué es una clase inmutable? ¿Cómo
se crean en Java?
Una clase
inmutable es una clase cuyas instancias no pueden ser modificadas. Se
inicializa en el momento de la construcción y no puede modificarse
posteriormente durante la ejecución del programa.
Son
eficientes y seguras, además de ser seguras para hilos (thread-safe). Son
especialmente útiles en aplicaciones concurrentes.
Para crear
un objeto inmutable en Java, es necesario seguir las siguientes reglas:
- Declarar la clase como final (para evitar que sea extendida).
- Haz todos los campos private y
final.
- No proporcionar métodos setters
(modificadores).
- Inicializar todos los campos en el
constructor.
- Si existen campos mutables, es
necesario devolverlos con una copia defensiva.
La
biblioteca de inmutables permite crear clases inmutables de manera
sencilla.
Más
información: Escuela Spring
7. ¿Qué es una interfaz? ¿Puedes crear
el cuerpo de un método en una interfaz?
Una
interfaz es un tipo de referencia en Java. Es una colección de métodos
abstractos. Contiene solo la declaración de los métodos, pero su cuerpo se
implementa en otra parte. Otra clase implementa la interfaz, heredando así los
métodos abstractos. La clase implementadora contiene la definición de los
métodos.
Normalmente
no es posible crear el cuerpo de un método en una interfaz. El cuerpo del
método debe crearse en la clase implementadora. Sin embargo, esta funcionalidad
se ha añadido en Java 8 a través de los llamados Métodos Predeterminados
(Default Methods).
8. ¿Qué son los métodos
predeterminados?
Los métodos
predeterminados son métodos cuya implementación está presente en las propias
interfaces. Solo están disponibles a partir de Java 8. Por lo tanto, un
implementador no necesita anular los métodos de una interfaz (pero puede
hacerlo).
9. ¿Qué es la sobreescritura de métodos
(method overriding)?
La sobreescritura
de métodos es posible gracias a la herencia. Cuando tenemos una superclase con
el método A, cada subclase que hereda de ella puede tener diferentes
implementaciones del método, según las necesidades de la clase. En palabras
simples: la sobreescritura de métodos está presente cuando una subclase
proporciona la implementación específica del método que ha sido declarado por
su clase padre. La sobreescritura de métodos debe cumplir tres
criterios:
- El método debe tener el mismo
nombre en la superclase y en las subclases.
- El método debe tener los mismos
parámetros que en la clase padre.
- Debe haber una relación IS-A
(herencia).
La sobreescritura
es posible a través de la anotación: @Override
Fuente: Oracle
10. ¿Puedes sobrescribir (override) el
constructor de una clase?
No, los
constructores no pueden ser sobrescritos.
11. ¿Qué es un constructor
predeterminado de una clase?
Un
constructor predeterminado es un constructor sin parámetros formales y sin
cláusula throws, generado automáticamente por el compilador si no se ha
especificado otro constructor.
Fuente: Oracle
12. ¿Puedes sobrescribir (override)
métodos estáticos?
No. Cuando
creamos un método estático en una subclase con el mismo nombre y parámetros que
en la superclase, el método estático en la superclase queda oculto.
Fuente: Oracle
13. ¿Qué significa la sobrecarga de
métodos (method overloading)?
La
sobrecarga de métodos ocurre cuando tenemos múltiples métodos con el mismo
nombre, pero diferentes parámetros. La sobrecarga puede ocurrir cambiando el
número de argumentos o el tipo de datos.
Fuente: Javatpoint
14. ¿En qué consiste el patrón de diseño
Singleton?
Singleton
es un patrón de diseño que asegura que solo existe una única instancia de un
objeto. Lo logra declarando un objeto estático de sí mismo dentro de la clase y
haciendo que el constructor sea privado. Por lo tanto, la única forma de
acceder a él es a través del objeto estático.
El patrón
Singleton también pertenece a los patrones creacionales y se basa en la
declaración de que la clase contiene una instancia estática de sí misma. Esta
instancia puede accederse a través de un método estático
llamado getInstance(). El constructor de esta clase debe ser privado. Por
lo tanto, esta clase no puede ser instanciada, asegurando que solo exista un
único objeto de esta clase en todo momento.
Fuente: Tutorialspoint
15. ¿Es posible utilizar Singleton de
manera segura en entornos multihilo?
La
implementación básica del patrón de diseño Singleton no es apropiada para
entornos multihilo. No obstante, existen implementaciones de Singleton seguras
en entornos multihilo. Éstas son:
ü Bill Pugh Singleton: Conocido
también como Holder Singleton. Utiliza una clase anidada, la cual es a su vez
estática y privada. La clase anidada es la que inicializa el singleton.
ü Enum Singleton: Implementación de
Singleton que utiliza un enum, en lugar de una clase normal para su
implementación. Al tratarse de un enum, no es posible que existan dos
instancias haciendo esta implementación segura para entornos multihilo.
Fuentes: Baeldung, Tutorialspoint
16. ¿Qué es el patrón Factory?
El patrón
Factory es un patrón de diseño en el cual, en lugar de usar el operador
habitual new para crear objetos, creamos una clase especializada que
maneja la creación de múltiples objetos. Para crear un nuevo objeto, utilizamos
una clase Factory que se encarga de establecer los atributos y valores
apropiados.
Fuente: Tutorialspoint
17. ¿Qué es el patrón Builder?
El patrón
Builder es un patrón de diseño creacional que permite la construcción paso
a paso de objetos complejos. Separa la construcción de un objeto de su
representación, lo que permite que el mismo proceso de construcción cree
diferentes representaciones. Sus características clave incluyen:
- Construcción paso a paso: Los objetos se construyen de
manera incremental, lo que permite un mayor control sobre el proceso de
construcción.
- Separación de responsabilidades: El patrón separa la lógica de
construcción de la representación del objeto, haciendo que el código sea
más limpio y fácil de mantener.
- Encadenamiento de métodos: A menudo utiliza el
encadenamiento de métodos (method chaining) para establecer
diversos atributos del objeto que se está construyendo.
Este patrón
es particularmente útil cuando un objeto requiere muchos parámetros o cuando el
proceso de construcción es complejo.
18. ¿Es posible la herencia múltiple en
Java?
Java no
permite heredar de más de una clase para evitar problemas asociados con la
herencia múltiple de estado. Sin embargo, Java permite la herencia múltiple de
tipo, lo que significa que una clase puede implementar más de una interfaz.
Fuente: Oracle
19. ¿Qué es la composición en Java?
La
composición define una relación de agregación en el sentido de que la clase
"A" tiene una clase "B". Por ejemplo, la clase "Carro"
tiene una clase "Rueda". En este sentido, uno de los atributos de una
clase es otra clase.
20. ¿Qué es una clase interna en Java?
Una clase
interna, también llamada clase anidada, es una clase cuya declaración forma
parte de la declaración de otra clase. Generalmente, hay dos tipos de clases
anidadas: estáticas y no estáticas. Los beneficios de las clases anidadas
incluyen: permiten el uso de modificadores de acceso dentro de la clase,
haciendo posible crear clases privadas. Además, las clases internas tienen
acceso a las variables privadas de la clase externa.
Fuente: Tutorialspoint
21. ¿Qué es una clase local en Java?
Una clase
local es una clase definida dentro de un bloque. Por ejemplo, puedes definir
una clase local en el cuerpo de un método, en un bucle "for" o en una
cláusula "if".
Fuente: Oracle
22. ¿Qué es una clase anónima? ¿Cuándo
podemos usarla?
Una clase
anónima es una clase local sin nombre. Es decir, una clase que se define en un
bloque (como un "for", un método, un "if") y no tiene
nombre. Las usamos solo si necesitamos utilizar una clase local solo una vez.
Se recomienda usar clases anónimas cuando hay necesidad de declarar campos o
métodos adicionales.
23. ¿Qué es la inyección de
dependencias?
La
inyección de dependencias es una técnica en la que se proporcionan a un objeto
las dependencias que necesita en lugar de que él mismo las cree. Esto es
especialmente útil para las pruebas, ya que permite simular o sustituir las
dependencias. Las dependencias pueden inyectarse mediante diferentes métodos,
como la inyección por constructor o por métodos setter. Además, existen
frameworks especializados en inyección de dependencias, como Spring, que
facilitan este proceso.
24. ¿Qué son los streams en Java?
Streams son
una nueva abstracción introducida en Java 8 que permite el procesamiento
funcional de colecciones de datos (como listas o arreglos) de forma declarativa
y eficiente. Además, facilita el procesamiento paralelo de colleciones de datos
y hace el código más legible y mantenible.
Entre las operaciones más comunes de los streams encontramos:
- filter(Predicate<T>): filtra elementos.
- map(Function<T, R>): transforma cada elemento.
- sorted(): ordena los elementos.
- limit(n): toma solo los primeros n elementos.
- collect(Collectors.toList()): recolecta el resultado en una lista.
- reduce(): combina los elementos en un único resultado.
25. ¿Qué son las funciones lambda en
Java?
Característica de
Java 8 que permite escribir funciones anónimas, es decir funciones sin un
nombre específico.
Se definen con
las sintaxis:
(argumentos)
-> expresión
(argumentos)
-> {
cuerpo de la
función…
Return
valor;
}
O más concretamente:
(x, y) -> x
+ y
Fuente: Escuela Spring
Comments
Post a Comment