Задачи на JPoint 2018. Luxoft. День 2

Задача 1

public class Quiz_1 {

    public static void print() {
        System.out.print("A");
    }
    
    public static void main(String[] args) {
        ((Quiz_1) null).print();
        System.out.print("B");
    }
    
}

Варианты ответов:

  1. AB
  2. B
  3. NullPointerException
  4. Compilation error
Правильный ответ

1. AB

Из документации 15.12.4.1. Compute Target Reference (If Necessary) instanceof можно узнать, что вызов статического метода не требует вычисления ссылки на инстанс, поэтому никакой ошибки не произойдёт.


Задача 2

public class Quiz_2 {

    public void func(Integer i) {
        System.out.println("integer"); }
    public void func(Double i) {
        System.out.println("double"); }
    public void func(Object i) {
        System.out.println("object"); }

    public static void main(String[] args) {
        List nums = Arrays.asList(1/2);
        new Quiz_2().func(nums.get(0));
    }
}

Варианты ответов:

  1. integer
  2. double
  3. object
  4. Runtime exception
  5. Compilation error
Правильный ответ

3. object

… из-за того, что список List<?> nums типизирован <?>. Такой вайлдкард вернёт Object в любой ситуации, а компилятор заранее скомпилирует представленный код с вызовом правильной функции, а именно public void func(Object i) {.


Задача 3

public class Quiz_3 {

    public static void main(String[] args) {
        System.out.println(
                true?false:true == true?false:true
        );
    }
}

Варианты ответов:

  1. true
  2. false
  3. Compilation error
Правильный ответ

2. false

Тернарный оператор вычисляется слева направо.


Задача 4

public class Quiz_4 {

    public static void main(String[] args) {
        int n = 1;
        int result = Optional.of(n++)
                .map(i -> i + n)
                .orElse(-1);
        System.out.println(result);
    }
}

Варианты ответов:

  1. 2
  2. 3
  3. 4
  4. -1
  5. Runtime exception
  6. Compilaction error
Правильный ответ

6. Compilation error

Переменная n должна быть финальной, чтобы использоваться в лямбда-выражении i -> i + n. С другой стороны, n не может быть финальной из-за унарного оператора ++ в выражении Optional.of(n++).


Задача 5

public class Quiz_5 {

    public static void main(String[] args) {
        int n = Integer.MAX_VALUE;
        n++;
        System.out.println(n + n);
    }
}

Варианты ответов:

  1. -2
  2. 0
  3. 2
  4. 4294967296 (2^32)
  5. Runtime exception
  6. Compilation error
Правильный ответ

2. 0

Начнём с того, что Integer.MAX_VALUE + 1 = Integer.MIN_VALUE. В бинарном представлении значение Integer.MAX_VALUE (01111111111111111111111111111111) при добавлении к нему единицы получится Integer.MIN_VALUE (10000000000000000000000000000000). При сложении 2-х этих чисел сумма старших битов даст 102, что приведёт к переполнению в памяти. Поскольку 1 будет некуда записать в 32-х битном представлении, то останутся только нули.

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: