kotlin精讲-第2章(3)val和var
难度指数:★★☆☆☆
收获指数:★★★☆☆
什么是变量?变量就是内容可以改变的量。Kotlin的变量分为“可变变量”和“不可变变量”两种类型。
可变变量通过var(来自variable)关键字进行声明,不可变变量通过val(来自value)进行声明。
可变变量:变量可以进行多次修改,对应java中的普通变量(非final变量)。
不可变变量:变量只能进行一次初始化,对应java中的final类型的变量。
【Kotlin相比于Java,不可变类型的变量只需要用val修饰即可,而不需要使用public static final修饰,是不是减少了一些代码呢?】
如果一个变量只是声明,需要约束变量的具体类型:
参考如下代码:

针对以上代码,如果我们放开第6行注释,就会提示如下错误:

提示“This variable musteither have a type annotation or be initialized”,也就是“这个变量要么有类型申明,要么被初始化”。因为如果一个变量只申明不赋值,不约束变量具体类型是不允许的。
Kotlin中变量不能重复定义:
假设我们有如下代码:

针对以上代码,如果我们放开第4行的注释,会有如下的编译提示,参考截图:

IDEA提示“Conflicting declarations:var a:String ,var a:String”,也就是“变量a和变量a定义冲突”。
变量声明有多种形式
我们可以只声明变量不赋值变量,可以声明变量的同时赋值变量,可以声明变量和赋值变量分开。参考如下代码:

变量类型支持自动推断
如果在声明变量的同时赋值了变量,那么我们可以省去变量类型,因为编译器有足够信息可以推断出变量的类型是什么,参考如下代码:

变量a和变量b的类型都没有指定,都可以编译通过。
不可变类型变量进行二次赋值会提示错误。
如果变量类型是不可变类型,那么只能赋值一次,如果进行第二次赋值,则会提示错误,参考代码:

针对以上代码,如果我们放开第16行的注释,则会出现如下的编译错误,参考截图:

编译器提示“Val cannot bereassigned”也就是“Val类型变量,也就是不可变类型变量,不能被二次赋值”。
val变量优先
val变量和var变量我们在开发过程中怎么去选择呢?只要可能,我们在开发中可以记住一个原则“val类型变量优先”,也就是我们首先使用val不变值。
val类型变量和var类型变量字节码区别
我们知道,val变量只能被赋值一次,那就类似Java语言中的final关键字修饰的变量。Kotlin中val关键字修饰的变量,是否会被转换成Java里面的final关键字修饰的变量呢?我们可以通过查看编译转换的字节码文件。
怎么查看Kotlin代码编译之后的字节码文件呢?比如,我们想查看如下代码的字节码文件:

双击两下Shift按键,调出“Search EveryWhere窗口”,然后输入“ShowBytecode”

点击进入,然后看到如下结果:

不过,字节码文件不通过单独的学习,我们没法看懂。我们可以把字节码文件转成java文件去看,接着我们点击“Decompile”按钮:

看到如下结果,参考截图:

可以看到,val类型的成员变量a,转换为Java代码的时候,被添加上了final关键字。
看字节码的过程,给大家做个gif
