【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)(二)

简介: 【Kotlin】变量简介 ( 可空类型 | lateinit | 初始化判定 | 非空类型 | !! 与 ? 修饰符 | ?= ?. ?: 运算符 | 抽象属性变量)(二)

VI . Kotlin 可空变量


Kotlin 中的可空变量 , 与 Java 变量性质相同 , 所有的 Java 变量都是可空变量 ;



1 . 可空变量 声明 : 声明可空类型变量时 , 再其变量类型后 , 添加 ? 修饰 ; 注意不是变量名称后 , 是变量类型后 ;


class Student(){
    var name : String ?= null
    var age : Int? = null
    var height : Int ?= 0
}


2 . 可空变量初始化 :



① 必须初始化 : 可空变量也必须初始化 , 但可以初始化为 null 空值 ;


② 不能延迟初始化 : 可空类型不能使用 lateinit 关键字修饰 ;




VII . !! 与 ? 修饰符


1 . 可空类型前提 : !! 与 ? 修饰符 使用的前提是变量必须是 可空类型 , 非空类型不允许使用 !! 与 ? 修饰符 ;



2 . ? 和 !! 用法 : 放在变量后面 , 修饰变量 ; 如果变量不为空 , 没有任何区别 , 下面讨论变量为空的情况 ;



3 . ? 修饰变量 : 如果该变量为空 , 那么装作什么都没发生 , 继续向后执行 ; 下面的示例输出结果是 Student : name = null , age = 0 ;



?. 运算符 : 这种用法 , 也可以看成是 ?. 运算符 , 意思就是如果不为空 , 才获取值 , 如果为空 , 直接返回 null , 继续向后执行 ;


class Student(){
    var name : String ?= null
    var age : Int = 0
}
fun main() {
    var student = Student()
    //输出结果 : Student : name = null , age = 0
    println("Student : name = ${student.name?.length} , age = ${student.age}")
}



4 . !! 修饰变量 : 如果该变量为空 , 与 Java 一样 , 报空指针异常 , 应用崩溃 ; 报空指针错误 kotlin.KotlinNullPointerException ;


class Student(){
    var name : String ?= null
    var age : Int = 0
}
fun main() {
    var student = Student()
    //输出结果 : Student : name = null , age = 0
    println("Student : name = ${student.name!!.length} , age = ${student.age}")
}



报错信息 : 此时报错空指针异常 ;


Exception in thread "main" kotlin.KotlinNullPointerException
  at variable.VariableKt.main(Variable.kt:10)
  at variable.VariableKt.main(Variable.kt)




VIII . ?= 与 ?. 与 ?: 运算符


1 . ?= 声明可空类型 : ? 还有一个作用是声明可空变量 , 此时 ? 修饰符必须在 变量类型之后 ; 声明可空类型后 , 可以为其正常赋值 , 也可以为变量赋空值 ;


class Student(){
    var name : String? = "Tom"
    var age : Int ?= null
}


2 . ?. 运算符 : 这种用法 , 也可以看成是 ?. 运算符 , 意思就是如果不为空 , 才获取值 , 如果为空 , 直接返回 null , 继续向后执行 ;


class Student(){
    var name : String ?= null
    var age : Int = 0
}
fun main() {
    var student = Student()
    //Student : name = null , name length = null , age = 0
    println("Student : name = ${student.name} , name length = ${student.name?.length} , age = ${student.age}")
}


控制台输出 :


Student : name = null , name length = null , age = 0



3 . ? : 运算符 : 该运算符是双目运算符 , 作用是前者如果为空 , 那么取后者的值 ;



① 与 Java 三木运算符 对比 : 在 Kotlin 中这个运算符与 Java 中不太一样 , 这也是一个双目运算符 , 中间不能有值 , Java 中该运算符是三木运算符 ;


class Student(){
    var name : String ?= null
    var age : Int = 0
}
fun main() {
    var student = Student()
    //Student : name = Tom , name length = 888 , age = 0
    println("Student : name = ${student.name?:"Tom"} , name length = ${student.name?.length?:888} , age = ${student.age?:18}")
}


② 控制台输出 :


Student : name = Tom , name length = 888 , age = 0

③ 代码分析 :


student.name?:"Tom" 代码中 , student.name 为空 , 那么取值后面的 "Tom" 字符串 , 因此打印的时候 , 打印 "Tom" 字符串 ;



student.name?.length?:888 代码分析 :


student.name 是空的 , 取值 null ;


student.name?.length 相当于 null?.length 其取值也是 null ;


那么 student.name?.length?:888 相当于 null?:888 ;


最终取值是右侧的 888 值 , 因此打印的时候打印 888 ;




IX . 抽象属性变量


1 . Kotlin 变量初始化 : Kotlin 中的变量是必须进行初始化的 , 可空变量 与 非空变量要求不一样 , 但是原则上都必须初始化 ;



① 非空变量 : 非空变量可以使用 lateinit 修饰 , 也可以直接进行非空值的初始化 , 直接赋值 null 报错 ;


② 可空变量 : 必须初始化 , 哪怕初始化为 null 也可以 ; 不能使用 延迟初始化 ;




2 . 变量不用初始化的特殊情况 : 抽象类 的 抽象属性 , 可以不进行初始化 , 但此时也不能使用 ; 该属性实现的时候 , 重写的属性必须进行初始化操作 , 与普通变量要求一样 ;


abstract class Variable(){
    //抽象类的抽象属性可以不用初始化
    abstract var age : Int
}
//抽象类的实现类必须进行初始化
class Student() : Variable(){
    override var age: Int = 0
}



目录
相关文章
|
6月前
|
编译器 C++ Kotlin
【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val
【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val
40 0
|
8月前
|
IDE Java 编译器
Kotlin属性访问器与方法签名冲突的问题
Kotlin属性访问器与方法签名冲突的问题
57 0
|
9月前
|
Java 编译器 Kotlin
Kotlin 中变量,类型,表达式,函数详解
Kotlin 中变量,类型,表达式,函数详解
70 0
|
5月前
|
Java 测试技术 持续交付
百度搜索:蓝易云【NetMock简介:简化 Java,Android和Kotlin多平台中的HTTP请求测试?】
使用NetMock,您可以在单元测试、集成测试和端到端测试中轻松地模拟和验证HTTP请求和响应,而无需实际发送请求到外部服务。这样可以提高测试的可靠性和可控性,并加快测试执行的速度。无论是在开发过程中还是在持续集成环境中,NetMock都可以帮助您更轻松地进行HTTP请求测试,提高代码质量和稳定性。
43 1
|
5月前
|
Kotlin
kotlin的..<运算符
kotlin的..<运算符
26 0
|
5月前
|
Kotlin
kotlin获取属性注解
kotlin获取属性注解
58 0
|
7月前
|
Cloud Native Go Kotlin
Kotlin 环境下解决属性初始化问题
Kotlin 环境下解决属性初始化问题
30 0
|
9月前
|
Java Kotlin
Kotlin中与Java互操作与可空性、类型映射、属性访问、@JvmOverloads、@JvmField、@JvmStatic、@Throws和函数类型操作详解
Kotlin中与Java互操作与可空性、类型映射、属性访问、@JvmOverloads、@JvmField、@JvmStatic、@Throws和函数类型操作详解
71 0
|
9月前
|
Java Kotlin
Kotlin 中初始化块、初始化的顺序、lateinit延迟初始化详解
Kotlin 中初始化块、初始化的顺序、lateinit延迟初始化详解
63 0