kotlin只允許在變量前面聲明兩種關(guān)鍵字:val或者var
val:(value的簡寫)用來聲明一種值柒巫,這種值在賦值之后不可改變父叙,對應(yīng)Java中的final(這不是常量嗎...)
var:(variable的簡寫),聲明變量
類型推導(dǎo)機(jī)制
既然在變量前只允許聲明兩種關(guān)鍵字,那么他怎么知道這是什么類型呢璃俗?
比如我們在剛剛的代碼上加入一行:var a = 10
package com.example.test
fun main() {
var a = 1
print("hello world! a is:" + a)
}
這樣寫運(yùn)行是沒什么問題的,但是會(huì)報(bào)一個(gè)警告:Convert concatenation to template
也就是說他不推薦我們用+去拼接字符串悉默,按照提示自動(dòng)幫我們改成
package com.example.test
fun main() {
var a = 1
print("hello world! a is:$a")
}
運(yùn)行結(jié)果是一樣的:hello world! a is:1
我們定義了一個(gè)變量并將一個(gè)數(shù)字賦值給他城豁,那么這個(gè)變量的類型就是整型變量,如果將字符串賦值給他那么他就是個(gè)字符串變量抄课,不可能是其他唱星,這就是推導(dǎo)機(jī)制。
但是跟磨,當(dāng)我對一個(gè)變量延遲賦值怎么辦间聊?他是一個(gè)什么類型的值呢?
這時(shí)候抵拘,Kotlin的類型推倒機(jī)制就不能正常工作了哎榴,這時(shí)候就需要顯示的去聲明變量,Kotlin提供了對這一功能的支持
語法:val a: Int = 1
這時(shí),我們顯示的聲明了a為Int型尚蝌,如果再去賦值為String型迎变,就會(huì)報(bào)錯(cuò)
這里需要注意的地方:Int首字母是大寫的,拋棄了Java中的基本數(shù)據(jù)類型
這一個(gè)小小的差別意味著飘言,在Java中這是一個(gè)基本數(shù)據(jù)類型衣形,而在Kotlin中,他變成了一個(gè)類姿鸿,他具有屬性和方法
而Java由于基本數(shù)據(jù)類型的存在谆吴,也使得他不是一個(gè)完完全全的面向?qū)ο笳Z言,只能算是半面向?qū)ο笳Z言
Java和Kotlin數(shù)據(jù)類型對照表
Java基本數(shù)據(jù)類型 | Kotlin對象數(shù)據(jù)類型 | 數(shù)據(jù)類型說明 |
---|---|---|
byte | Byte | 字節(jié)型 |
int | Int | 整型 |
short | Short | 短整型 |
long | Long | 長整型 |
float | Float | 單精度浮點(diǎn)型 |
double | Double | 雙精度浮點(diǎn)型 |
char | Char | 字符型 |
boolean | Boolean | 布爾型 |
為什么設(shè)計(jì)val苛预,只使用var不行嗎纪铺?
其實(shí)這是為了解決Java中final關(guān)鍵字沒有被合理使用的問題
在Java中,如果不手動(dòng)聲明final碟渺,那么這個(gè)變量就是可變的鲜锚,這不一定是個(gè)好事,你永遠(yuǎn)不知道這個(gè)值被誰在什么時(shí)候給修改了苫拍,從而帶來bug的難以查找和定位芜繁,除非一個(gè)值可以變,否則都應(yīng)該加上final绒极,但是很多人沒這個(gè)意識骏令,僅僅是因?yàn)镴ava對此不是強(qiáng)制的
不僅僅是這些,final修飾的關(guān)鍵字與不做修飾的相比垄提,性能上也會(huì)有些差異:
final修飾的全局變量會(huì)被當(dāng)做常量來使用榔袋,放入Constant pool中。
被final修飾的局部變量會(huì)直接被優(yōu)化成常量铡俐,字節(jié)碼直接存儲(chǔ)運(yùn)算后的常量凰兑。
由于Java規(guī)范規(guī)定,final修飾的方法不能被重寫审丘,所以jvm實(shí)現(xiàn)中invokevirtual在調(diào)用final修飾的方法(final方法是非虛方法)時(shí)會(huì)省去對方法接收者的多態(tài)選擇
作者:Joash
鏈接:https://www.zhihu.com/question/38264283/answer/82342134
來源:知乎
所以吏够,在kotlin中,我們盡量使用val去修飾變量滩报,只有當(dāng)val不滿足時(shí)锅知,才聲明為var