Preguntas Tricky de Entrevista de Java

Hace algún tiempo escribí un artículo sobre Las 50 principales preguntas de programación en Java. A nuestros lectores les gustó mucho. Así que hoy veremos algunas preguntas de entrevista complicadas en Java.

Preguntas complicadas de entrevista en Java

Estas son preguntas de programación, pero a menos que tengas un profundo entendimiento de Java, será difícil adivinar la salida y explicarla.

1. Nulo como argumento

Tenemos funciones sobrecargadas y estamos pasando nulo. ¿Qué función será llamada y cuál será la salida del programa?

public class Test {
	public static void main(String[] args) {
		foo(null);
	}
	public static void foo(Object o) {
		System.out.println("Object argument");
	}
	public static void foo(String s) {
		System.out.println("String argument");
	}
}

2. Usa “L” para long

¿Puedes adivinar la salida de las siguientes declaraciones?

long longWithL = 1000*60*60*24*365L;
long longWithoutL = 1000*60*60*24*365;
System.out.println(longWithL);
System.out.println(longWithoutL);

Explicación de la pregunta complicada de argumento nulo

Según las especificaciones de Java, en caso de sobrecarga, el compilador selecciona la función más específica. Obviamente, la clase String es más específica que la clase Object, por lo tanto, imprimirá “String argument”. Pero, ¿qué pasa si tenemos otro método en la clase como se muestra a continuación?

public static void foo(StringBuffer i){
	System.out.println("StringBuffer impl");
}

En este caso, el compilador de Java arrojará un error como “El método foo(String) es ambiguo para el tipo Test”. String y StringBuffer no tienen jerarquía de herencia. Así que ninguno de ellos es más específico que el otro. Un método es más específico que otro si cualquier invocación manejada por el primer método podría pasarse al otro sin un error de tipo en tiempo de compilación. Podemos pasar String como parámetro al método de argumento Object y al método de argumento String pero no al método de argumento StringBuffer.

Explicación para la variable Long

El resultado del fragmento de código será:

31536000000
1471228928

Estamos creando explícitamente la primera variable como long añadiendo un sufijo “L”. Entonces el compilador la tratará como long y la asignará a la primera variable. Para la segunda declaración, el compilador realizará el cálculo y lo tratará como un entero de 32 bits. Dado que la salida está fuera del rango del valor máximo del entero (2147483647), el compilador truncará los bits más significativos y luego los asignará a la variable. El equivalente binario de 1000*60*60*24*365L = 011101010111101100010010110000000000 (36 bits). Después de eliminar los 4 bits más significativos para acomodarse en un int de 32 bits, el nuevo valor = 01010111101100010010110000000000 (32 bits). Esto es igual a 1471228928 y por lo tanto la salida. Recientemente he creado una serie de videos de YouTube para programas complicados de Java.

Puedes ver más ejemplos de programas de Java en nuestro Repositorio de GitHub.

Source:
https://www.digitalocean.com/community/tutorials/java-tricky-interview-questions