Найти в Дзене

Модификаторы доступа в Kotlin и Java

Это одна из тех тем, которую вроде бы все знают, но многие путаются. Давайте разберёмся. Здесь всё просто: В Java: public class Cat { } В Kotlin: class Cat { } // по умолчанию public public — доступно везде. И в Java, и в Kotlin это работает одинаково. В Java: public class Cat { private void meow() {} } В Kotlin: class Cat { private fun meow() {} } В обоих языках private означает: видно только внутри текущего класса. Но в Kotlin есть одна фишка: мы можем писать private на уровне файла. Этот secret будет доступен только в этом .kt-файле. Это удобно, чтобы, например, прятать константы или что-то, что не должно быть видно снаружи. В Java protected — это когда метод/параметр доступен: В Kotlin: Фишка в том, что в Kotlin protected доступен только внутри самого класса и его наследников, и только изнутри этих классов. То есть мы не можем извне вызвать kitty.meow() даже если это наследник. Только внутри самого класса-наследника. В Java нет internal. А в Kotlin это суперполезная штука: такой
Оглавление

Это одна из тех тем, которую вроде бы все знают, но многие путаются. Давайте разберёмся.

public — всё доступно

Здесь всё просто:

В Java: public class Cat { }

В Kotlin: class Cat { } // по умолчанию public

public — доступно везде. И в Java, и в Kotlin это работает одинаково.

private — никто, кроме меня

В Java: public class Cat { private void meow() {} }

В Kotlin: class Cat { private fun meow() {} }

В обоих языках private означает: видно только внутри текущего класса.

Но в Kotlin есть одна фишка: мы можем писать private на уровне файла.

Этот secret будет доступен только в этом .kt-файле. Это удобно, чтобы, например, прятать константы или что-то, что не должно быть видно снаружи.

protected — вот тут начинается подвох

В Java protected — это когда метод/параметр доступен:

  • внутри класса
  • внутри наследников
  • и из другого пакета через наследника
-2

В Kotlin:

-3

Фишка в том, что в Kotlin protected доступен только внутри самого класса и его наследников, и только изнутри этих классов. То есть мы не можем извне вызвать kitty.meow() даже если это наследник. Только внутри самого класса-наследника.

internal — скрыто для модуля

В Java нет internal.

А в Kotlin это суперполезная штука: такой класс доступен только внутри модуля. То есть, если мы пишем библиотеку, мы можем скрыть реализацию от внешнего мира, но при этом использовать её внутри модуля без ограничений.

Это как package-private в Java, только лучше — потому что не зависит от структуры пакетов.

package-private (без модификатора) — только Java

В Java если мы просто пишем:

class Cat { void meow() { } }

Это будет “package-private” — доступно только из того же пакета.

В Kotlin такого нет вообще. В Kotlin мы всегда явно пишем модификатор. Если не указали — будет public по умолчанию.

Если кратко:

  • public — одинаковый и доступен везде
  • private — одинаковый, но в Kotlin можно делать private на уровне файла
  • protected — в Kotlin строже: только внутри класса и его наследников, без доступа снаружи
  • internal — только в Kotlin: видно внутри одного модуля
  • package-private — только в Java: доступ в пределах одного пакета

P.S. Если кому-то хочется почитать документацию, то для Джавы - https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html и там же есть отличная табличка с описанием:

-4
-5

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes