1.1.50.10. fejezet, Láthatóság

// file name: example.kt
package foo
 
private fun foo() { ... } // visible inside example.kt
 
public var bar: Int = 5 // property is visible everywhere
    private set         // setter is visible only in example.kt
 
internal val baz = 6    // visible inside the same module

Top level elemektől kezdve minden osztály és azok tulajdonságain, konstruktorain vagy metódusain át, az interfészek és azok minden eleme rendelkezhet láthatósági jelöléssel. Alapértelmezetten minden public láthatóságú.

Osztályok tagjai

  • private azt jelenti, hogy a tag csak ezen az osztályon belül látható (beleértve annak összes tagját).
  • protected azt jelenti, hogy a tag láthatósága megegyezik a private jelöltével, de az alosztályokban is látható
  • internal azt jelenti, hogy a modulon belüli (nem package hanem egy maven projekt vagy gradle projekt) bármely elem, ami látja a deklaráló osztályt, látja annak tagjait
  • public azt jelenti, hogy minden elem, ami látja a deklaráló osztályt, látja annak tagjait

Például:

open class Outer {
    private val a = 1
    protected open val b = 2
    internal open val c = 3
    val d = 4  // public by default
 
    protected class Nested {
        public val e: Int = 5
    }
}
 
class Subclass : Outer() {
    // a is not visible
    // b, c and d are visible
    // Nested and e are visible
 
    override val b = 5   // 'b' is protected
    override val c = 7   // 'c' is internal
}
 
class Unrelated(o: Outer) {
    // o.a, o.b are not visible
    // o.c and o.d are visible (same module)
    // Outer.Nested is not visible, and Nested::e is not visible either
}

Konstruktor láthatósága:

class C private constructor(a: Int) { ... }

Alapértelmezettként a konstruktorok public láthatóságúak. Lokális változóknak, funkcióknak és osztályoknak nincs láthatósági besorolása.