Автор оригинала: Pankaj Kumar.
Некоторое время назад я написал статью о 50 лучших вопросах программирования на Java . Нашим читателям это очень понравилось. Поэтому сегодня мы рассмотрим некоторые сложные вопросы для интервью на Java.
Сложные вопросы для интервью на Java
Это вопросы программирования, но если у вас нет глубокого понимания Java, будет трудно угадать результат и объяснить его.
1. Значение Null в качестве аргумента
У нас перегружены функции, и мы передаем значение null. Какая функция будет вызвана и каков будет результат работы программы?
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. Используйте “L” в течение длительного времени
Можете ли вы угадать результат приведенных ниже утверждений?
long longWithL = 1000*60*60*24*365L; long longWithoutL = 1000*60*60*24*365; System.out.println(longWithL); System.out.println(longWithoutL);
Объяснение Каверзного вопроса с нулевым аргументом
Согласно спецификациям Java, в случае перегрузки компилятор выбирает наиболее конкретную функцию . Очевидно, что класс String более специфичен, чем класс объекта, поэтому он выведет “Строковый аргумент”.
Но что, если у нас есть другой метод в классе, как показано ниже.
public static void foo(StringBuffer i){
System.out.println("StringBuffer impl");
}
В этом случае компилятор Java выдаст ошибку как “Метод foo(Строка) неоднозначен для теста типа”. Строка и буферная строка не имеют иерархии наследования. Таким образом, ни один из них не является более специфичным для других.
Метод более специфичен, чем другой, если любой вызов, обработанный первым методом, может быть передан другому без ошибки типа во время компиляции.
Мы можем передать строку в качестве параметра объектному аргументу и строковому аргументу, но не методу аргумента StringBuffer.
Объяснение длинной переменной
Вывод фрагмента кода будет:
31536000000 1471228928
Мы явно создаем первую переменную до тех пор, пока не добавим суффикс “L”. Таким образом, компилятор будет рассматривать его как длинный и назначит его первой переменной.
Для второго оператора компилятор выполнит вычисление и обработает его как 32-разрядное целое число. Поскольку выходные данные выходят за пределы диапазона максимального значения целого числа (2147483647), компилятор усечет наиболее значимые биты, а затем присвоит их переменной.
Двоичный эквивалент (36 бит).
После удаления 4 наиболее значимых битов для размещения в 32-разрядном int, новый (32 бита).
Это равно 1471228928 и, следовательно, выходу.
Недавно я создал серию видеороликов на YouTube для сложных программ на java.