Как в Java создать объект ссылочного типа без оператора new?

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

Ответ

Да, это возможно. Хотя оператор new — основной способ создания объектов, Java предоставляет несколько синтаксических сокращений и механизмов, которые не требуют его явного использования.

Способы создания объектов без явного new:

  1. Строковые литералы (создание в пуле строк):

    String literal = "Hello"; // Объект String создается JVM, не используется new
  2. Автоупаковка (для wrapper-классов):

    Integer num = 42; // Компилятор преобразует в Integer.valueOf(42)
    Boolean flag = true; // Boolean.valueOf(true)
  3. Инициализация массивов:

    int[] numbers = {1, 2, 3}; // Эквивалентно new int[]{1, 2, 3}
    String[] names = {"Alice", "Bob"};
  4. Фабричные и статические методы:

    List<String> list = List.of("a", "b"); // Статический фабричный метод
    Optional<String> opt = Optional.empty();
    LocalDate date = LocalDate.now();
  5. Клонирование:

    MyClass original = new MyClass();
    MyClass copy = original.clone(); // Вызов protected метода clone()
  6. Десериализация:

    ObjectInputStream in = new ObjectInputStream(...);
    MyClass obj = (MyClass) in.readObject(); // Объект воссоздается из потока байтов

Важное замечание: В большинстве случаев (кроме строковых литералов и десериализации) эти способы внутри себя все равно используют new. Они предоставляют более удобный или безопасный API для разработчика. Например, Integer.valueOf() может возвращать кэшированный объект для небольших значений, но для новых значений создаст его через new Integer().