本文收錄于 kotlin入門潛修專題系列,歡迎學(xué)習(xí)交流兜粘。
創(chuàng)作不易申窘,如有轉(zhuǎn)載,還請備注孔轴。
kotlin是一門什么樣的編程語言剃法?
kotlin是一種運(yùn)行在java虛擬機(jī)上的靜態(tài)編程語言,和java一樣距糖。有些朋友聽到j(luò)ava虛擬機(jī)可能會反射性的想到那不是java專有的嗎玄窝?當(dāng)然不是,實際上任何能夠編譯成符合java虛擬機(jī)規(guī)范的語言都能運(yùn)行到j(luò)vm上悍引。koltin正是滿足這一要求的語言。kotlin可以完全兼容java語法帽氓,因此學(xué)習(xí)的時候可以類比于java趣斤。
起源
2011年,JetBrains推出了kotlin項目黎休。我們知道JetBrains浓领,應(yīng)該就是其開發(fā)的、大名鼎鼎的idea系列ide势腮。是的联贩,JetBrains之所以要推出kotlin,就是在滿足和java一樣編譯速度的時候捎拯,提供更多的語言新特性泪幌。這些語言特性解決了java語言的很多缺陷。
正式基于這些思想署照,JetBrains于2016年2月15日正式發(fā)布了第一個官方穩(wěn)定版本V1.0祸泪,并從該版本開始向后兼容。
當(dāng)然建芙,對kotlin影響最大的就是2017年在google I/O大會上没隘,google正式宣布kotlin成為Android官方開發(fā)語言。這則消息在android開發(fā)界引起不小的轟動禁荸,可以認(rèn)為自此之后kotlin真正的進(jìn)入了大眾化視野右蒲。
kotlin有哪些新特性?
這里簡單的感知下kotlin中的一些新特性赶熟,具體將會在接下來的文章中慢慢闡述瑰妄。
語法
kotlin的語法受到了眾多語言(如java、javascript钧大、groovy等)的影響翰撑,并在此基礎(chǔ)上優(yōu)化了實現(xiàn)方案,提供了很多極其簡潔的寫法。比如kotlin是一門面向?qū)ο蟮恼Z言眶诈;kotlin不再強(qiáng)制語句結(jié)尾處必須寫上分號(;)涨醋;kotlin支持使用字符串模板;kotlin能有效避免java中人人詬命的空指針問題等等逝撬。
語法特性先知
這里先大概介紹kotlin中的部分語言特性浴骂,后面的文章都會詳細(xì)闡述。
常量和變量
kotlin中常量的定義關(guān)鍵字是val(全稱value)宪潮,變量的定義關(guān)鍵字是var(全稱variable)溯警,如下:
val a : Int = 1//常量a,無法再次進(jìn)行賦值
var x = 2//變量x狡相,可以再次進(jìn)行賦值
x = a//為變量x賦值
上面也看出來kotlin變量或者常量的定義已經(jīng)和java完全不一樣梯轻,kotlin中變量的定義都要以var關(guān)鍵字開頭,而常量的定義都要以val關(guān)鍵字開頭尽棕,之后跟著的是變量或者常量名喳挑,然后是冒號,最后才是真正的類型滔悉。這就是kotlin定義變量或者常量的語法格式伊诵。實際上kotlin是很智能的,通常我們可以省略真正的類型回官,因為kotlin會自動進(jìn)行推斷曹宴,如下所示:
val a = 1//編譯器自動推斷a為整型
方法
kotlin中使用fun關(guān)鍵字來定義方法,語法格式如下:
fun 函數(shù)名(入?yún)?:類型歉提,入?yún)?:類型笛坦,...): 返回值{}
具體示例如下:
fun sum(a: Int, b: Int): Int {}
那么kotlin中程序的入口方法該怎么定義呢?其實同java一樣唯袄,kotlin的入口程序也是函數(shù)名為main的靜態(tài)方法弯屈,只不過寫法有所不同,kotlin中main的入口方法有兩種寫法(注意下面寫法位于同一個文件中):
//伴隨對象形式的寫法恋拷,@JvmStatic標(biāo)識為靜態(tài)類型资厉,這種寫法和java中的main方法寫法完全一致。
class Main {
companion object {
@JvmStatic fun main(args: Array<String>) {
}
}
}
//寫法2蔬顾,top-level級別的
fun main(args: Array<String>) {
}
上面展示了兩種程序入口main方法的寫法宴偿,后面有文章會再加闡述。
方法擴(kuò)展
這個方法擴(kuò)展和C#诀豁、javascript類似窄刘,都是無需在繼承該類的情況下,擴(kuò)展該類的功能舷胜。
示例如下:
fun String.lastChar(): Char = get(length - 1)
這個擴(kuò)展了String類娩践,即增加了一個lastChar方法,這樣以后所有字符串都可以這么用。如下所示:
println("hello word".lastChar())//打印 'd'
基于函數(shù)擴(kuò)展翻伺,kotlin還可以進(jìn)行運(yùn)算符重載
如下所示:
//Point類
class Point(val x: Int, val y: Int) {
override fun toString(): String {//這里重寫了toString材泄,方便println打印數(shù)據(jù)。
return "x = " + x + "; y = " + y
}
}
//重載運(yùn)算符
operator fun Point.plus(other: Point): Point {
return Point(this.x + other.x, this.y + other.y)
}
class Main {
companion object {
@JvmStatic fun main(args: Array<String>) {
val p1 = Point(1, 2)
val p2 = Point(2, 3)
println(p1 + p2)//打印'x = 3; y = 5'
}
}
}
上面即是運(yùn)算符重載吨岭,這里先知道即可拉宗,后文有文章闡述。
如何解決java中的空指針辣辫?
kotlin有項語言特性旦事,可以有效避免java中控制很,示例如下:
var str :String? = null//注意String后面的問號急灭,這標(biāo)明str變量可為null姐浮,否則就無法賦值為null
var str: String = null//編譯錯誤,String需要定義為String?
val len = str?.length//注意str?寫法化戳,這表示单料,只有當(dāng)str不為null的時候才獲取str的length
val len = str!!.length//注意str!!寫法,這個種寫法表示点楼,當(dāng)str為空時就會直接拋出異常
kotlin還有更多的新特性,如:
構(gòu)造方法 vs 二級構(gòu)造方法
高階方法與lambda
解構(gòu)聲明
類相關(guān)
函數(shù)嵌套
等等...
這些特性都會在本專題的文章中一一闡述白对。