【Kotlin 初学者】变量-常量-数据类型

1,126 阅读4分钟

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战

本文内容:声明变量、只读变量、内置数据类型、类型推断、编译时常量。

变量

var 关键字

Kotlin 使用 var 关键字定义可变变量(可读可写),类似Java中的一般变量。

跟 Java 的区别就是 类型的位置从变量名前面挪到变量名后面了。如下图:

语法

实践

fun main() {
    var str: String = "Hello Kotlin"
    println(str)
    str = "Hello ShuaiCi"
    println(str)
}

运行结果

"E:\Android\Android StudioO\jre\bin\java.exe"...
Hello Kotlin
Hello ShuaiCi

Process finished with exit code 0

查看Java代码

仅赋值一次

fun main() {
    var str: String = "Hello Kotlin"
    println(str)
}

黄色提示:大致意思就是你的变量不会修改,可以使用 val 定义为不可变量变量,下面咱们看看

val 关键字

Kotlin 使用 val 关键字定义不可变变量,只能赋值一次的变量(类似Java中final修饰的变量),不是常量不能混淆呦。

语法

val <变量名> : <类型> = <初始化值>

实践

fun main() {
    val age : Int = 100
    println(age)
}

运行结果

"E:\Android\Android StudioO\jre\bin\java.exe"...
100

Process finished with exit code 0

查看Java代码

对不可变量进行再次赋值

提示:Val cannot be reassigned(Val 不能重新赋值)

内置数据类型(常用)

类型描述
String字符串
Char单字符
Booleantrue/false
Int整形
Double小数
List集合
Set无重复的元素集合
Map键值对的集合

Kotlin的引用类型

  • Java有两种数据类型:
    • 引用类型(堆内存)
    • 基本数据类型(栈内存)
  • Kotlin只提供引用类型这一种数据类型,出于更高性能的需要,Kotlin编译器会在Java字节码中修改为基本数据类型

类型推断

对于已声明并赋值的变量,它允许你省略类型定义。

从上图你会发现 String 和 Int 都是灰色的。

提示:显式给定的类型在这里是多余的

移除掉显示的类型声明

实践

fun main() {
    //类型推断
    var type = "Hello Type"//自动推断为String
    println(type)

    var a = 10      //自动推断为Int
    println(a)

    var b = true    //自动推断为Boolean
    println(b)

    var d :String   //如果不在声明时初始化则必须提供变量类型
    d = "HHH"       //明确赋值
    println(d)
}

运行结果

"E:\Android\Android StudioO\jre\bin\java.exe"...
Hello Type
10
true
HHH

Process finished with exit code 0

查看Java代码

编译时常量

编译时常量只能在函数之外定义,为什么?

因为编译时常量必须在编译时赋值,而函数都是在运行时才调用函数内的变量也是在运行时赋值

编译时常量只能是常见的基本数据类型:String、 Int、Double、Float、Long.Short、Byte、Char、Boolean。

类似Java的public static final

实践,如下:

const val MAX = 65535
fun main() {
    println(MAX)
}

查看Java代码,如下:

"const"不适用于"局部变量",如下:

延迟初始化lateinit

  • 使用lateinit关键字相当于做了一个约定:在用它之前负责初始化
  • 执行islnitialized检查lateinit变量是否完成初始化

使用lateinit关键字

class UserInfo4() {
    lateinit var name:String //属性延迟初始化
    fun addName(_name:String){
        name = _name
    }

    fun readName(){
        //直接使用如果name未做初始化会报错。
        println(name)
    }
}

fun main() {
    var  userInfo4 = UserInfo4()
    userInfo4.readName()
}

添加islnitialized检查

执行islnitialized检查lateinit变量是否完成初始化,未完成初始化则不执行打印。

惰性初始化by lazy

你可以暂时不初始化某个变量,直到首次使用它再进行初始化,这个叫作惰性初始化

class UserInfo4() {
    ...
    val age by lazy { ageAdd() }//惰性初始化
    //如果不调用age, ageAdd()函数永远不执行
    private fun ageAdd(): Int {
        return 18
    }
}
fun main() {
    var userInfo4 = UserInfo4()
    userInfo4.addName("Hello Kotlin")
    userInfo4.readName()
    println("------")
    println(userInfo4.age)
}

正常执行

String 模板

  • 模板支持在字符串的引号内放入变量值
  • 字符串内嵌表达式。
fun main() {
    val name: String = "Shuaici"
    val age: Int = 18
    val money: Float = 1.25f
    //引号内放入变量值
    println("$name 今年 $age ,身上带了 $money 巨款")

    val isMan: Boolean = true
    //添加表达式
    println("$name 是个 ${if (isMan) "纯爷们" else "萌妹子"}")
}

运行结果

"E:\Android\Android StudioO\jre\bin\java.exe"...
Shuaici 今年 18 ,身上带了 1.25 巨款
Shuaici 是个 纯爷们

Process finished with exit code 0

自动补全(输出)

变量名.sout

看完了上手练练,光看短时间能记住,时间长不用就忘记了,还要再看一遍,还不如自己上手练一下。