В Java package-private — это уровень доступа "по умолчанию" (без указания модификаторов публичности: public, protected, private). Такой член класса (метод, поле или сам класс) доступен только из классов того же пакета.
class MyClass { /* ... */ } void doSomething() { /* ... */ }
Пример:
// Файл: com/example/internal/Helper.java class Helper { static void help() { System.out.println("helped"); } }
Всегда используйте package-private, если класс или метод — внутренняя деталь реализации.
Вопрос: Может ли package-private класс быть виден внутри другого пакета через наследование или import?
Ответ: Нет, к package-private членам нельзя получить доступ ни через наследование, ни через import из других пакетов — они доступны только внутри своего пакета.
История
В крупном проекте разные команды начали использовать package-private классы для утилитарной логики. Когда код пытались переиспользовать из других пакетов, не получалось — доступ был невозможен. В результате пришлось делать классы public, что открыло внутреннюю реализацию.
История
В многомодульном проекте package-private классы стали причиной проблем при написании модульных тестов: тесты в другом пакете не увидели package-private методы, и пришлось перемещать тесты внутрь исходного пакета или ослаблять уровень доступа.
История
При миграции кода в новый пакет были неожиданные compile-time ошибки — многие методы и классы неожиданно "исчезли", потому что они были package-private и стали недоступны после смены пакета.