前置知识
- 有
Java
编程基础
前言
前文为大家浅浅介绍了 kotlin
这一门语言,给大家讲述了 kotlin
这个新型基于 jvm
平台的语言的优势,以及我们 Android 开发者学习的必要性。话不多说,本篇正式开启 kotlin
的学习历程,带你正式踏入 kotlin
大门。
至于使用的编译工具,依旧是我们日常开发使用的 Android studio 或者 IDEA ,新建一个 kotlin 文件即可开启编码。或者可以使用 kotlin官方的 在线网站 来学习。
(上述为在线网站截图,同时指出 main
函数如何写)
本篇文章,先带大家学习 kotlin
中的 变量
不一样的变量
类型声明
关于类型声明,我们在 Java
中会经常用到,就是我们在定义变量的时候,在变量名之前要写的声明。
//java String stringValue = "abc"; int intValue = 1; Long longValue = 1234; 复制代码
上述 Java
代码的变量声明,换到 kotlin
中是这样子的。
//kotlin var stringValue = "abc" var intValue = 1 var longValue = 1234 复制代码
在 kotlin
中,我们的变量类型声明变成了使用 var
或者 val
来进行声明,同时每一行末尾不再使用分号
其中,var
全称是 variable ,意思为可变。其意思正是 可变变量 ,对应于 Java
中的非 final
类型。
val
全称是 value ,更精准的释义应该是:引用不可变,对应于 Java
中的 final
类型。
我们先来以 var
为例子学习 kotlin
中的变量,val
类型稍后再说。
大家对于上述的 kotlin
代码也许会有疑惑,为何 kotlin
可以不做类型声明呢,难道它能自己知道我要的是什么类型的变量么?
是的,kotlin
大部分情况下可以知道你要声明的是什么类型的变量,这是得益于它的 类型推导 机制。当我们在变量后面写了表达式或者对应的值时,我们可以不用声明变量的类型,让编译器自动推导类型。
那当我们偏要声明变量类型,或者我们未赋值时候,如何声明变量呢?
在 kotlin
中,类型声明是使用 <name>:<object>
这种类型来声明的,我们继续使用上述的demo。
//偏要声明 var stringValue:String = "abc" var intValue:Int = 1 var longValue:Long = 1234 //无法类型推导,必须做类型声明 var stringValue:String var intValue:Int var longValue:Long 复制代码
我们会发现 Java
中的 int
和 long
这里的首字母变成了大写。那是因为,kotlin
中不再有基本变量类型,全面转变为对象数据类型。下面给出对应的表格
val 引用不可变
为什么 val
更准确的说法是 引用不可变 呢?
因为 val
的设计和 Java
中的 final
是一样的,不可变的是指引用的数据地址不可变,而非地址内的值不可变。如果这样子说,你依旧感到晦涩,可以查看下述的代码。
fun main() { val num = intArrayOf(1,2,3) num = intArrayOf(2,2,3) } 复制代码
上述代码中,我们直接修改 val
类型的变量,给这个变量赋予新的数组。会出现报错,告知我们 val
类型不可重复赋值。但当我们修改代码如下,会发现数组的内容是可以修改的。
fun main() { val num = intArrayOf(1,2,3) // num = intArrayOf(2,2,3) num[0] = 2 println(num[0]) } 复制代码
所以说,val 中不可变的是对变量的引用,而非变量本身的内容。
而出现这种现象的根本原因是底层数据设计的问题。
我们知道,在 Java
中,final
修饰的基本数据类型是放在运行时常量池中,修饰的类信息是放在堆的方法区中,本质上他们都是放置于 堆内存 中。
相同的,val
的特性实现和 final
一样,它修饰的数组也是存储于 堆内存 中。所以也意味着只是引用不可改,但是引用的对象可改。
var 存在的意义
val
是 kotlin
中默认推荐的修饰,我在这里也推荐你,优先使用 val
来声明一个变量。为什么呢?因为 val
是引用不可变,使用这种修饰,会是你的编程好习惯,它能避免你的变量在不知情的情况下被别人修改,这也就可以避免很多不必要的bug。同时,也建议你在使用 Java的时候,默认给变量都加上 final
。
val 那么好,那为啥 var 还要存在呢?
var 是表示某个变量可变,我们日常开发中,总会需要某个变量是可变的。否则,当我们要使某个数递增的时候,会变得异常困难。这就是它存在的道理。