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

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

I . Kotlin 变量总结


初学 Kotlin , 对变量机制不清楚的同学们 , 看完这篇博客基本就对变量的定义和使用有清晰的认识 ;



1 . 变量定义只有四种情况 : ① 非空变量 / 可空变量 直接赋值非空初始值 ; ② 可空变量使用 ?= null 赋空值 ; ③ 非空变量 ( 引用类型 ) 使用 lateinit 修饰 ; ④ 抽象属性变量不初始化 ;



2 . !! 与 ? 修饰符 : 仅对于 可空类型 有效 , ? 高级不报错 , !! 低级报空指针异常 ;



3 . ?= 与 ?. 与 ?: 运算符 : ?= 用于声明可空类型 , ?. 用于空值校验 . ?: 用于空值替换 ;




II . Kotlin 非空变量


1 . Kotlin 变量分类 : Kotlin 中的变量分为两种 , 非空变量 和 可空变量 , 其中非空变量是困扰广大 Java 开发者的一大难题 , 因为 Java 中没有非空变量这个概念 , Kotlin 中各种 ?= , ?. , ?: , !! 等操作 , Java 中的所有变量都是可空的 ;



2 . Kotlin 变量的默认状态 : Kotlin 中变量默认是非空变量 , 默认状态下 , Kotlin 必须进行初始化 ;



3 . 非空变量 初始化 和 延迟初始化 : 非空变量只能有下面两种操作 , 抽象属性变量情况特殊另作说明 ;



① 直接初始化 : 直接赋值一个非空初始值 , 非空变量不能赋值 null , 否则编译器会报错 ;


② 延迟初始化 : 引用类型变量使用 lateinit 关键字修饰 , 延迟初始化时机 , 可以在使用前进行初始化 ; 但是如果使用前没有初始化 , 执行时会报错 ;



class Student(){
  // 延迟初始化
    lateinit var name : String
    // 直接初始化
    var age : Int = 0
}


4 . 特殊情况 : 如果是非空对象是抽象类中的抽象属性 , 那么可以不进行初始化 , 但在其实现中 , 也是必须进行初始化或者延迟初始化的 ;




III . 非空变量不能赋空


1 . 非空变量 初始化时 不能赋值 null : 非空变量初始化时 , 不能为空 , 否则会报错 Property must be initialized or be abstract ;



image.png


2 . 非空变量 使用时 不能赋值 null :

image.png


① 变量赋值 null 情况 : 如果为 Kotlin 的非空变量 , 也就是默认状态下的变量 , 赋值 null , 编译器直接报错 ;




② 报错信息如下 : Null can not be a value of a non-null type Int ;


③ 报错分析 : 声明的 var age : Int = 0 变量 , 其默认是 非空类型 , 即 age 变量 , 用户调用时不能为空 , 故意赋值为空 , 系统不允许这种操作 ;


④ lateinit 不初始化情况 : 使用 lateinit 修饰的变量 , 但如果不初始化 , 那么调用肯定报错 , 但是报的是未初始化错误 ; 不初始化不是为空 , 但不能调用 ;




IV . lateinit 关键字


lateinit 关键字 使用要求 : 只能修饰 非空类型 , 并且是 引用数据类型 ;



① 只能修饰非空变量 : 不能修饰可空变量 , 否则报错信息如下 'lateinit' modifier is not allowed on properties of nullable types ;

image.png



② 只能修饰引用数据类型 : 不能修饰 8 88 种基本数据类型 , 否则报错 'lateinit' modifier is not allowed on properties of primitive types ;

image.png




2 . 基础数据类型非空变量 : 如果 非空变量 类型是 8 88 种基础数据类型 , 那么该变量必须赋值一个数值 , 其不能被 lateinit 修饰 , 只能先随意赋予一个初始值 , 一般设置 0 , False , 0F 等初始值 ;




V . lateinit 初始化判定


1 . 延迟初始化属性初始化判定 : this::name.isInitialized



2 . 判定需求 : 非空变量 由于存在 延迟初始化 , 那么在调用该变量的时候 , 该变量有可能没有进行初始化 , 需要判定该变量是否初始化 ;



3 . 本类中判定 : 延迟初始化 属性 只能在本类中使用 this::属性名称.isInitialized 进行判定 , 如果返回 true , 说明已经初始化 , 如果返回 false , 说明该属性还没有进行初始化 ;



4 . 其它类中判定 : 如果要在其它类中判定本类某个属性是否已经初始化 , 需要定义一个 public 方法 , 提供判定接口 , 如下代码示例 :



5 . 代码示例 :


class Student(){
    lateinit var name : String
    var age : Int = 0
    fun isNameInitialized() : Boolean{
        println("this::name.isInitialized = ${this::name.isInitialized}")
        return this::name.isInitialized
    }
}
fun main() {
    var student = Student()
    if(student.isNameInitialized()) {
        println("name 属性已经初始化完毕")
    }else{
        println("name 属性没有进行初始化")
    }
}


执行结果 :


this::name.isInitialized = false
name 属性没有进行初始化



目录
相关文章
|
4天前
|
Kotlin
Kotlin中的数值类型
Kotlin中的数值类型
11 2
|
4天前
|
存储 安全 Kotlin
Kotlin中的可空类型
Kotlin中的可空类型
10 1
|
4天前
|
存储 Kotlin
Kotlin中布尔类型、字符类型、字符串类型和数组类型
Kotlin中布尔类型、字符类型、字符串类型和数组类型
9 1
|
4天前
|
Kotlin
Kotlin中的算数运算符
Kotlin中的算数运算符
10 3
|
4天前
|
设计模式 Java Kotlin
Kotlin中的委托、属性委托和延迟加载
Kotlin中的委托、属性委托和延迟加载
6 1
|
3天前
|
Java Kotlin
Kotlin 中的 with 函数简介
Kotlin 中的 with 函数简介
3 0
|
3天前
|
安全 Kotlin
Kotlin中的安全导航操作符?.、空合并运算符?:以及let函数的实践与理解
Kotlin中的安全导航操作符?.、空合并运算符?:以及let函数的实践与理解
4 0
|
8月前
|
编译器 C++ Kotlin
【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val
【Kotlin】基础速览(1):操作符 | 内建类型 | 类型转换 | 字符串模板 | 可变 var 和不可变 val
42 0
|
7月前
|
Java 测试技术 持续交付
百度搜索:蓝易云【NetMock简介:简化 Java,Android和Kotlin多平台中的HTTP请求测试?】
使用NetMock,您可以在单元测试、集成测试和端到端测试中轻松地模拟和验证HTTP请求和响应,而无需实际发送请求到外部服务。这样可以提高测试的可靠性和可控性,并加快测试执行的速度。无论是在开发过程中还是在持续集成环境中,NetMock都可以帮助您更轻松地进行HTTP请求测试,提高代码质量和稳定性。
48 1
|
7月前
|
Kotlin
kotlin的..<运算符
kotlin的..<运算符
31 0