Algum tempo atrás, escrevi um artigo sobre Top 50 Perguntas de Programação Java. Nossos leitores gostaram muito. Então, hoje vamos analisar algumas perguntas complicadas de entrevista em Java.
Perguntas Tricky de Entrevista em Java
Essas são perguntas de programação, mas a menos que você tenha um entendimento profundo de Java, será difícil adivinhar a saída e explicá-la.
1. Null como Argumento
Temos funções sobrecarregadas e estamos passando null. Qual função será chamada e qual será a saída do 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. Use “L” para longo
Você consegue adivinhar a saída das declarações abaixo?
long longWithL = 1000*60*60*24*365L;
long longWithoutL = 1000*60*60*24*365;
System.out.println(longWithL);
System.out.println(longWithoutL);
Explicação da Questão Tricky de Argumento Nulo
De acordo com as especificações do Java, no caso de sobrecarga, o compilador seleciona a função mais específica. Obviamente, a classe String é mais específica do que a classe Object, portanto imprimirá “argumento String”. Mas, e se tivermos outro método na classe como abaixo.
public static void foo(StringBuffer i){
System.out.println("StringBuffer impl");
}
Nesse caso, o compilador Java lançará um erro como “O método foo(String) é ambíguo para o tipo Test”. String e StringBuffer não têm hierarquia de herança. Portanto, nenhum deles é mais específico que o outro. Um método é mais específico que outro se qualquer chamada tratada pelo primeiro método pudesse ser passada para o outro sem um erro de tipo de compilação. Podemos passar String como parâmetro para argumento Object e argumento String, mas não para o método de argumento StringBuffer.
Explicação para Variável Longa
A saída do trecho de código será:
31536000000
1471228928
Estamos criando explicitamente a primeira variável como long adicionando um sufixo “L”. Assim, o compilador tratará como long e o atribuirá à primeira variável. Para a segunda declaração, o compilador realizará o cálculo e o tratará como um inteiro de 32 bits. Como a saída está fora do intervalo do valor máximo do inteiro (2147483647), o compilador truncará os bits mais significativos e então os atribuirá à variável. O equivalente binário de 1000*60*60*24*365L = 011101010111101100010010110000000000 (36 bits). Após remover os 4 bits mais significativos para acomodar em um int de 32 bits, o novo valor = 01010111101100010010110000000000 (32 bits). Isso é igual a 1471228928 e, portanto, a saída. Recentemente, criei uma série de vídeos no YouTube sobre programas complicados em Java.
Você pode conferir mais exemplos de programas Java em nosso Repositório do GitHub.
Source:
https://www.digitalocean.com/community/tutorials/java-tricky-interview-questions