Каковы основные различия модификаторов доступа в Java и Kotlin?

«Каковы основные различия модификаторов доступа в Java и Kotlin?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Модификаторы доступа определяют область видимости классов, функций и свойств. Kotlin вносит ключевые изменения по сравнению с Java.

Сравнительная таблица:

Модификатор Java Kotlin
public Виден везде. Виден везде. Модификатор по умолчанию.
protected Виден в пакете и подклассах (даже из других пакетов). Виден только в подклассах. Не даёт доступа внутри пакета.
internal Отсутствует. Новый модификатор. Виден внутри модуля (набора скомпилированных файлов).
private Виден только внутри класса. Виден внутри класса или файла (для top-level объявлений).
package-private (default) Виден внутри пакета (модификатор не указывается). Отсутствует. Вместо него используйте internal для видимости в модуле или private для файла.

Пример в Kotlin:

// Файл: Network.kt
internal class HttpClient { // Виден в этом модуле
    private val apiKey = "secret" // Виден только в этом классе
    protected fun init() { } // Виден в HttpClient и его наследниках
    fun makeRequest() { } // public по умолчанию, виден везде
}

private fun helper() { } // Видна только в этом файле (Network.kt)

Почему так сделано в Kotlin?

  1. public по умолчанию упрощает код.
  2. internal решает проблему слабой инкапсуляции на уровне пакетов в Java, предоставляя контроль на уровне модуля.
  3. protected становится строже и логичнее, так как пакеты в Kotlin — это в первую очередь способ организации пространств имён, а не механизм контроля доступа.