kotlin之变量

kotlin只允许在变量前面声明两种关键字:val或者var

val:(value的简写)用来声明一种值,这种值在赋值之后不可改变,对应Java中的final(这不是常量吗…)

var:(variable的简写),声明变量

类型推导机制

既然在变量前只允许声明两种关键字,那么他怎么知道这是什么类型呢?

比如我们在刚刚的代码上加入一行:var a = 10

package com.example.test

fun main() {
    var a = 1
    print("hello world! a is:" + a)
}

这样写运行是没什么问题的,但是会报一个警告:Convert concatenation to template

也就是说他不推荐我们用+去拼接字符串,按照提示自动帮我们改成

package com.example.test

fun main() {
    var a = 1
    print("hello world! a is:$a")
}

运行结果是一样的:hello world! a is:1

我们定义了一个变量并将一个数字赋值给他,那么这个变量的类型就是整型变量,如果将字符串赋值给他那么他就是个字符串变量,不可能是其他,这就是推导机制。

但是,当我对一个变量延迟赋值怎么办?他是一个什么类型的值呢?

这时候,Kotlin的类型推倒机制就不能正常工作了,这时候就需要显示的去声明变量,Kotlin提供了对这一功能的支持

语法:val a: Int = 1

这时,我们显示的声明了a为Int型,如果再去赋值为String型,就会报错

这里需要注意的地方:Int首字母是大写的,抛弃了Java中的基本数据类型

这一个小小的差别意味着,在Java中这是一个基本数据类型,而在Kotlin中,他变成了一个类,他具有属性和方法

而Java由于基本数据类型的存在,也使得他不是一个完完全全的面向对象语言,只能算是半面向对象语言

Java和Kotlin数据类型对照表

Java基本数据类型 Kotlin对象数据类型 数据类型说明
byte Byte 字节型
int Int 整型
short Short 短整型
long Long 长整型
float Float 单精度浮点型
double Double 双精度浮点型
char Char 字符型
boolean Boolean 布尔型

为什么设计val,只使用var不行吗?

其实这是为了解决Java中final关键字没有被合理使用的问题

在Java中,如果不手动声明final,那么这个变量就是可变的,这不一定是个好事,你永远不知道这个值被谁在什么时候给修改了,从而带来bug的难以查找和定位,除非一个值可以变,否则都应该加上final,但是很多人没这个意识,仅仅是因为Java对此不是强制的

不仅仅是这些,final修饰的关键字与不做修饰的相比,性能上也会有些差异:

final修饰的全局变量会被当做常量来使用,放入Constant pool中。
被final修饰的局部变量会直接被优化成常量,字节码直接存储运算后的常量。
由于Java规范规定,final修饰的方法不能被重写,所以jvm实现中invokevirtual在调用final修饰的方法(final方法是非虚方法)时会省去对方法接收者的多态选择

作者:Joash
链接:https://www.zhihu.com/question/38264283/answer/82342134
来源:知乎

所以,在kotlin中,我们尽量使用val去修饰变量,只有当val不满足时,才声明为var

推荐阅读

kotlin之运行kotlin代码

微信扫描二维码,关注我的公众号
欢迎关注这个不是技术号的公众号,我们聊聊别的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章