Por que o código em uma expressão de objeto pode acessar variáveis do escopo que o contém no kotlin?

No Kotlin, o código em uma expressão de objeto pode acessar variáveis do escopo que o contém, assim como o código a seguir:

fun countClicks(window: JComponent) {
   var clickCount = 0
   var enterCount = 0
   window.addMouseListener(object : MouseAdapter() {
    override fun mouseClicked(e: MouseEvent) {
        clickCount++
    }

    override fun mouseEntered(e: MouseEvent) {
        enterCount++
    }
   })
}

Mas por que? Em Java, não é permitido fazer isso, porque o ciclo de vida do objeto é diferente das variáveis locais, portanto, oenterCount ouclickCount talvez seja inválido ao tentar acessar o objeto. Alguém pode me dizer como Kotlin faz isso?

questionAnswers(5)

yourAnswerToTheQuestion