Kotlin-局部变量与全局变量

时间:2019-02-16 15:21:04

标签: android kotlin

您可以在不初始化或不添加lateinit的情况下声明局部变量,但是对于全局变量而言并非如此,我的问题是为什么?为什么编译器也不会给出局部变量错误?

例如:

class A{

    var abc : String  // this is not allowed by compiler

    fun myOwnedFun(){
       var abcd : String // this is allowed 
    }

}

我知道一件事是允许的,而另一件事是不允许的,但是对为什么感到好奇。

2 个答案:

答案 0 :(得分:4)

局部变量的范围是定义它的函数。在首次访问函数之前,编译器在验证函数中是否已初始化局部变量时没有问题。

对于公共类字段,范围是无限的,因此编译器无法确保在访问该字段之前对其进行初始化。为了防止程序通过使用未初始化的变量进入错误状态,编译器会引发错误。

答案 1 :(得分:0)

class A{

    var abc : String  // throws compile time error

    fun myOwnedFun(){
       var abcd : String // throws compile time error while accessing it
       abcd. // throws error now, suggests you to initialize it.
    }

}

这是因为Kotlin是作为一种空安全语言构建的,这意味着所有变量都必须在使用它之前进行初始化,要么作为可空值,然后应将其后缀?并分配给null或其他类的默认构造函数,或者,如果确定在第一次访问它之前将其分配到某个地方,请使用lateinit var

在Android Kotlin中,lateinit var广泛用于将在生命周期方法中分配的全局变量,例如onCreate()等,