您可以在不初始化或添加lateinit的情况下声明局部变量,但对于全局变量则不然,我的问题是为什么?为什么编译器也没有为局部变量提供错误?
例如 :
class A{
var abc : String // this is not allowed by compiler
fun myOwnedFun(){
var abcd : String // this is allowed
}
}
我明白有一件事是允许的,另一件事不是,但我很好奇为什么。
局部变量的范围是定义它的函数。编译器在第一次访问之前验证局部变量是否已在函数内初始化是没有问题的。
对于公共类字段,范围是无限的,因此编译器无法确保在访问字段之前对字段进行初始化。为了防止程序通过使用未初始化的变量进入错误状态,编译器会引发错误。
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被构建为一个空的安全语言,这意味着所有变量必须在使用之前初始化,可以为nullable,后缀为?
,分配给null
或任何其他类的默认构造函数,或者使用lateinit var
如果您确定在首先访问它之前将某个地方分配给它。
在Android Kotlin中,lateinit var
被广泛用于全局变量,这些变量将在生命周期方法中分配,例如onCreate()
等,