Может ли компилятор Java предсказать пользовательский ввод во время компиляции?

«Может ли компилятор Java предсказать пользовательский ввод во время компиляции?» — вопрос из категории Other, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, компилятор не может предсказать или знать пользовательский ввод. Это принципиальное различие между этапами компиляции и выполнения (runtime).

Почему это невозможно:

  1. Время выполнения: Компиляция происходит до запуска программы. Пользовательский ввод происходит во время её работы.
  2. Внешние данные: Ввод с консоли, из файла или сети — это внешние по отношению к исходному коду данные.

Пример, демонстрирующий разницу:

import java.util.Scanner;

public class UserInputExample {
    public static void main(String[] args) {
        // Компилятор видит объявление Scanner и вызов nextInt(),
        // но НЕ ЗНАЕТ, какое конкретное число будет введено.
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введите число: ");

        int dynamicValue = scanner.nextInt(); // Значение определяется в runtime

        // Компилятор может оптимизировать это выражение, так как 10 — константа.
        int compileTimeConstant = 10; 

        System.out.println("Сумма: " + (dynamicValue + compileTimeConstant));
    }
}

Компилятор работает только со статическим кодом и известными на момент компиляции константами, но не с динамическими данными.