您可以在不初始化或不添加lateinit的情况下声明局部变量,但是对于全局变量而言并非如此,我的问题是为什么?为什么编译器也不会给出局部变量错误?
例如:
class A{
var abc : String // this is not allowed by compiler
fun myOwnedFun(){
var abcd : String // this is allowed
}
}
我知道一件事是允许的,而另一件事是不允许的,但是对为什么感到好奇。
答案 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()
等,