Можно ли в Java иметь два класса с одинаковым полным именем в одном приложении?

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

Ответ

Нет, нельзя. В одном classloader'е (загрузчике классов) Java не может загрузить два класса с одинаковым полным именем (fully qualified name), включающим пакет.

Почему:

  • Имя класса вместе с пакетом (com.example.MyClass) является его уникальным идентификатором в JVM.
  • При попытке загрузить класс с уже существующим именем будет выброшено java.lang.LinkageError.

Исключения и обходные пути:

  1. Разные ClassLoader'ы: Можно создать два изолированных classloader'а, каждый из которых загрузит свою версию класса. Это используется в серверах приложений для изоляции веб-приложений.
  2. Модули (Java 9+): Модульная система позволяет иметь "скрытые" (non-exported) классы с одинаковыми именами в разных модулях, если они не экспортируются в общее пространство.

Пример ошибки:

// File 1: com/example/Test.java
package com.example;
public class Test {}

// File 2: com/example/Test.java (такой же пакет и имя)
package com.example;
public class Test {}
// Компиляция возможна в разных директориях,
// но при запуске JVM загрузит только первый найденный класс.