English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Kotlin базовый учебник

Kotlin поток управления

Функции в Kotlin

Строки в Kotlin

Kotlin面向对象(OOP)

Модификаторы видимости в Kotlin

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

Модификаторы видимости — это ключевые слова, которые используются для установки видимости (доступности) классов, объектов, интерфейсов, конструкторов, функций, свойств и их установщиков (не можно устанавливать видимость getters, так как они всегда имеют такую же видимость, как и свойства)

ВКлассы и объекты в KotlinВ статье вы кратко узнали о модификаторах видимости public и private. В этой статье вы详细了解ете другие модификаторы видимости protected и internal (а также public и private).

Модификаторы видимости в пакете

Пакет организует группу связанных функций, свойств и классов, объектов и интерфейсов.

модификаторописание
publicВидно везде
privateВидимо в файле, содержащем объявление
internalВидимо в пределах одного модуля (группа файлов Kotlin, скомпилированных вместе)
protectedНедоступно для пакета (используется для подклассов)

Внимание:Если не указан модификатор видимости, то по умолчанию является значением по умолчанию public .

Давайте приведем пример:

// имя файла: hello.kt
package test
fun function1() {} // по умолчанию является общедоступным и виден везде
private fun function2() {} // виден только в hello.kt
internal fun function3() {} // виден в одном модуле
var name = "Foo" // везде виден
    get() = field // виден в hello.kt (как и его свойство)
    private set(value) { // виден только в hello.kt
        field = value
    {}
private class class1 {} // виден только в hello.kt

Модификаторы видимости в классах и интерфейсах

Ниже показано, как работают модификаторы видимости для членов классов (функций, свойств) внутри класса:

модификаторописание
publicвиден любому клиенту, видящему объявление класса
privateтолько внутри класса виден
protectedвнутри класса и его подклассов виден
internalКлиенты, видящие объявление класса в модуле, могут видеть его

Внимание:Если вы перегружаете protected член в производном классе и не указываете его видимость, то его видимость также будет protected.

Давайте приведем пример:

open class Base() {
    var a = 1 // по умолчанию общедоступен
    private var b = 2 // Base класс частный
    protected open val c = 3 // виден для Base и Derived классов
    internal val d = 4 // виден в одном модуле
    protected fun e() {} // виден для Base и Derived классов
{}
class Derived: Base() {
    // a, c, d и e() всех свойств класса Base видимы
    // b невидим
    override val c = 9 // c является protected
{}
fun main(args: Array<String>) {
    val base = Base()
    //base.a и base.d видимы
    // base.b, base.c и base.e() невидимы
    val derived = Derived()
    // derived.c невидим
{}

Изменение видимости конструктора

По умолчанию видимость конструктора public. Но вы можете изменить это. Для этого вам нужно явно добавить ключевое слово constructor.

В следующем примере конструктор по умолчанию public:

class Test(val a: Int) {
    // code
{}

Вы можете изменить его видимость следующим образом.

class Test private constructor(val a: Int) {
    // code
{}

Конструктор в данном случае private.

Внимание:  В Kotlin локальные функции, переменные и классы не могут иметь модификаторы видимости.