幼兒園入門
嘀嘀嘀校車來咯--kotlin是啥?了解一哈税娜!
Kotlin 是一種在 Java 虛擬機(jī)上運(yùn)行的靜態(tài)類型編程語言扔亥,被稱之為 Android 世界的Swift而姐,Kotlin 可以編譯成Java字節(jié)碼葬荷,也可以編譯成 JavaScript销斟,方便在沒有 JVM 的設(shè)備上運(yùn)行喂窟。在Google I/O 2017中测暗,Google 宣布 Kotlin 成為 Android 官方開發(fā)語言(那啥此處劃重點(diǎn)--重點(diǎn)了解)。
我覺得這句劃重點(diǎn)的話是我們選擇kotlin的關(guān)鍵谎替,當(dāng)然除了google支持的官方語言偷溺,它還有很多優(yōu)點(diǎn)比如說大大減少樣板代碼的數(shù)量,避免空指針異常等整個(gè)類的錯(cuò)誤钱贯,充分利用 JVM挫掏、Android 和瀏覽器的現(xiàn)有庫,可用任何 Java IDE 或者使用命令行構(gòu)建秩命。
開門上車--kotlin的hello world尉共!
Kotlin 程序文件以 .kt 結(jié)尾,如:hello.kt 弃锐、world.kt袄友。
class KotlinTest(){
fun hello(yourName : String){
println("hello world $yourName")
}
}
fun main(args: Array<String>) {
KotlinTest().hello("Licz")
}
老司機(jī)平穩(wěn)上路--基礎(chǔ)語法介紹!
定義基礎(chǔ)
- 常變量定義
在Kotlin中常量用val聲明霹菊,變量用var聲明剧蚣,關(guān)鍵字還是在名稱前面,類型用”:“隔開在名稱后面旋廷,或者也可以直接省略類型直接在名稱后用“=”賦值鸠按。
var <標(biāo)識(shí)符> : <類型> = <初始化值>
val <標(biāo)識(shí)符> : <類型> = <初始化值>
- 空安全定義
類型后帶“?”表示空安全即可為空,名稱后面帶“?”以及“!!”分別表示可返回null即空安全和拋出空指針異常(簡單理解饶碘?可以返回null即表示空安全目尖,!扎运!和java原本的類似瑟曲,什么都不加編譯器會(huì)在相對(duì)時(shí)刻檢測報(bào)錯(cuò))
//類型后面加?表示可為空
var age: String? = "23"
//拋出空指針異常
val ages = age!!.toInt()
- 懶加載
by lazy{} (多用于單例模式)只能用在val常量類型且只可以初始化一次想要多次初始化只能重新定義, lateinit 只能用在var變量類型并且不能用在java基本類型和可空類型且可以在任何位置初始化并且可以初始化多次
val name: String by lazy { "bestpay" }
lateinit var myTextView: Textview
- 函數(shù)定義
函數(shù)定義使用關(guān)鍵字 fun
幾種示范
fun sum(a: Int, b: Int){ // Int 參數(shù)饮戳,返回值 Int
printlb( a + b )
}
fun sum(a: Int, b: Int): Int { // Int 參數(shù),返回值 Int
return a + b
}
fun sum(a: Int, b: Int) = a + b
- 字符串模版
$ 表示一個(gè)變量名或者變量值洞拨,$varName 表示變量值扯罐,${varName.fun()} 表示變量的方法返回值:
var a = 1
val s1 = "a is $a"
val s2 = "${s1.replace("is", "was")}, but now is $a" // 解釋一下${}內(nèi)部可以是函數(shù)表達(dá)式
- 類型轉(zhuǎn)換以及自檢判斷
is 運(yùn)算符檢測一個(gè)表達(dá)式是否某類型的一個(gè)實(shí)例(類似于Java中的instanceof關(guān)鍵字)。
if (obj is String) {
// 做過類型判斷以后扣甲,obj會(huì)被系統(tǒng)自動(dòng)轉(zhuǎn)換為String類型
return obj.length
}
if (obj is String && obj.length > 0)
return obj.length
基礎(chǔ)數(shù)據(jù)類型
- Kotlin 的基本數(shù)值類型包括Byte篮赢、Short、Int琉挖、Long、Float涣脚、Double等示辈。不同于Java的是,字符不屬于數(shù)值類型遣蚀,是一個(gè)獨(dú)立的數(shù)據(jù)類型矾麻。其余基本同java。
- 注意幾點(diǎn):
16 進(jìn)制以 0x 開頭:0x0F芭梯;
2 進(jìn)制以 0b 開頭:0b00001011险耀;
長整型以大寫的 L 結(jié)尾:123L;
Double 默認(rèn)寫法: 123.5, 123.5e10玖喘;
Float 使用 f 或者 F 后綴:123.5f甩牺; - 也可以使用下劃線使數(shù)字常量更易讀(下劃線無實(shí)際意義類似于注釋的意思,怎么看著方便怎么加)
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val socialSecurityNumber = 999_99_9999L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
- Kotlin 中沒有基礎(chǔ)數(shù)據(jù)類型累奈,只有封裝的數(shù)字類型贬派,你每定義的一個(gè)變量,其實(shí) Kotlin 幫你封裝了一個(gè)對(duì)象澎媒,這樣可以保證不會(huì)出現(xiàn)空指針搞乏。數(shù)字類型也一樣,所有在比較兩個(gè)數(shù)字的時(shí)候戒努,就有比較數(shù)據(jù)大小和比較兩個(gè)對(duì)象是否相同的區(qū)別了请敦。在 Kotlin 中,三個(gè)等號(hào) === 表示比較對(duì)象地址储玫,兩個(gè) == 表示比較兩個(gè)值大小侍筛。
條件以及循環(huán)控制
-
條件控制
- if表達(dá)式
和java那一套很類似,不過更強(qiáng)大
- if表達(dá)式
val max = if (a > b) a else b //作為表達(dá)式缘缚,取代了java的三元操作符
- when表達(dá)式
移除了switch使用更加強(qiáng)大的when代替勾笆,when的子式可以是常亮、變量桥滨、返回?cái)?shù)值的表達(dá)式窝爪、返回boolean值的表達(dá)式弛车,強(qiáng)大到替換if...else if
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
//類似switch的用法
3,4 -> print("x == 3 or x == 4")
//由于沒有break 如果兩個(gè)值的處理邏輯一樣可以這樣用“,”隔開
is String -> x.startsWith("prefix")
//檢測一個(gè)值是(is)或者不是(!is)一個(gè)特定類型的值
else -> { // 注意這個(gè)括號(hào)
//注意else相當(dāng)于default
print("x 不是 1 ,也不是 2")
}
}
when (x) {
in 1..10 -> print("x is in the range")
!in validNumbers -> print("x is not valid")
//此處在(in)或者不在(!in)一個(gè)區(qū)間(注意區(qū)間蒲每,這里沒細(xì)說)
else -> print("none of the above")
}
when {
x.isGood() -> print("x is good")
x.isBad() -> print("x is bad")
else -> print("x is X")
//此處為替代if...else if的用法
}
-
循環(huán)控制
- for循環(huán)
有變化并且多出了幾個(gè)變種
- for循環(huán)
for (test in collection) print(test)//可以對(duì)任何提供迭代器(iterator)的對(duì)象進(jìn)行遍歷
for (test: Int in ints) {
//循環(huán)體是一個(gè)代碼塊
// ……
}
- while與do...while循環(huán)
基本同java無區(qū)別
while( 布爾表達(dá)式 ) {
//循環(huán)內(nèi)容
}
do {
//代碼語句
}while(布爾表達(dá)式);
- 返回和跳轉(zhuǎn)
return:默認(rèn)從最直接包圍它的函數(shù)或者匿名函數(shù)返回纷跛。
break:終止最直接包圍它的循環(huán)。
continue:繼續(xù)下一次最直接包圍它的循環(huán)邀杏。
for (i in 1..8) {
if (i==2) continue // i 為 2 時(shí)跳過當(dāng)前循環(huán)贫奠,繼續(xù)下一次循環(huán)
println(i)
if (i>=5) break // i 為 5 時(shí) 跳出循環(huán)
}
類以及對(duì)象
- 簡述
kotlin的類可以包含的和java代碼的類差不多,有構(gòu)造函數(shù)望蜡、內(nèi)部類唤崭、對(duì)象聲明、屬性脖律、函數(shù)谢肾,雖然類型差不多但是形式大大的不一樣。
class Bestpay{ //類名稱 bestpay
fun writeBug(){println("bug")}
//大括號(hào)內(nèi)是類內(nèi)部內(nèi)容
}
class Empty //定義空類
- 類屬性
var聲明可變小泉,val聲明不可變
注意一點(diǎn)kotlin中是沒有new這個(gè)關(guān)鍵字的直接在“=”后面寫要實(shí)例化的類就可以
一般要使用一個(gè)類屬性或某些方法只要在類后直接“.”屬性名
class Test{
val age : Int = 1
val name : String = "test"
fun writeBug(){println("bug")}
}
val bestpay = Test() //注意沒有new關(guān)鍵字
bestpay.name
bestpay.age
- 構(gòu)造方法
主構(gòu)造方法注意constructor關(guān)鍵字(可省略)還有init()函數(shù)
class Person constructor(firstName: String) {}
class Person (firstName: String) {
//此處沒有注解或者可見性修飾符省略constructor關(guān)鍵字
init{
//初始化代碼塊
//參數(shù)使用往上看B琛!微姊! 就是類名稱后面括號(hào)里面的東西K彳睢!兢交!
firstName == “l(fā)i”+firstName
}
}
次構(gòu)造方法也叫做二級(jí)構(gòu)造函數(shù)薪捍,需要加前綴constructor
class Person {
constructor(child: Person) {
}
}
class Person(val name: String) {//主構(gòu)造函數(shù)
constructor (name: String, age:Int) : this(name) {//次構(gòu)造函數(shù)
// 初始化...
}
class Person(val name: String) {//主構(gòu)造函數(shù)
constructor (name: String, age:Int,firstName:String) : this(name,age) {//次構(gòu)造函數(shù)
// 初始化...
}
注意如果類有主構(gòu)造函數(shù),每個(gè)次構(gòu)造函數(shù)都要魁淳,或直接或間接通過另一個(gè)次構(gòu)造函數(shù)代理主構(gòu)造函數(shù)飘诗。在同一個(gè)類中代理另一個(gè)構(gòu)造函數(shù)使用this關(guān)鍵字。
- 抽象類
abstract關(guān)鍵字了解一哈 - 內(nèi)部類
內(nèi)部類使用 inner 關(guān)鍵字來表示界逛。
內(nèi)部類會(huì)帶有一個(gè)對(duì)外部類的對(duì)象的引用昆稿,所以內(nèi)部類可以訪問外部類成員屬性和成員函數(shù)。
class Test {
val inn = "123"
inner class innerTest{
fun innertest(){
var t =this@Test
t.inn.equals(inn)
}
}
}
嵌套類
內(nèi)部類包含嵌套類息拜,嵌套類沒有inner關(guān)鍵字匿名內(nèi)部類
定義和java類似,沒有名字直接實(shí)例化使用溉潭,常用于接口等回調(diào)。
class Test {
var v = "成員屬性"
fun setInterFace(test: TestInterFace) {
test.test()
}
}
/**
* 定義接口
*/
interface TestInterFace {
fun test()
}
fun main(args: Array<String>) {
var test = Test()
/**
* 采用對(duì)象表達(dá)式來創(chuàng)建接口對(duì)象少欺,即匿名內(nèi)部類的實(shí)例喳瓣。
*/
test.setInterFace(object : TestInterFace {
//注意此處接口的調(diào)用方式
override fun test() {
println("對(duì)象表達(dá)式創(chuàng)建匿名內(nèi)部類的實(shí)例")
}
})
}
- 類修飾符
- classModifier: 類屬性修飾符,標(biāo)示類本身特性赞别。
abstract // 抽象類
final // 類不可繼承畏陕,默認(rèn)屬性
enum // 枚舉類
open // 類可繼承,類默認(rèn)是final的
annotation // 注解類
- classModifier: 類屬性修飾符,標(biāo)示類本身特性赞别。
- accessModifier: 訪問權(quán)限修飾符
private // 僅在同一個(gè)文件中可見
protected // 同一個(gè)文件中或子類可見
public // 所有調(diào)用的地方都可見(默認(rèn)修飾符仿滔,什么都不加就是public)
internal // 同一個(gè)模塊中可見(包內(nèi)可見) - 多嘴一句注意data類它是kotlin中特有的bean類用來寫pojo超級(jí)方便
data class User(val name: String, val age: Int)
data class TestData(@SerializedName("success") var success: String, @SerializedName("errorCode") var errorCode: String) {
}
就這樣簡單的一個(gè)data class惠毁,加上主構(gòu)造函數(shù)就構(gòu)成了kotlin的特有pojo類它有編譯器自動(dòng)生成的equals()/hashCode()方法犹芹、toString()方法、componentN()方法鞠绰、copy()方法以及“set/get”等方法腰埂。
一些補(bǔ)充
- “:”冒號(hào)的妙用 類的繼承、聲明常變量的類型蜈膨、函數(shù)的返回值等都有它的身影屿笼,除了以上還有Kotlin最終會(huì)還是編譯成Java字節(jié)碼,使用到Java類是必然的也是要用到“:”冒號(hào)的
val intent = Intent(this, Test::class.java)
- 除了冒號(hào)還有一個(gè)較重要的符號(hào)@翁巍,this后面加上@對(duì)象表明指返回哪一個(gè)(內(nèi)部類return處多用)
class User {
inner class FamilyUser{
fun getUser(): User{
//返回User
return this@User
}
fun getFamilyUser(): FamilyUser{
//返回FamilyUser
return this@FamilyUser
}
}
}
到站下車幼兒園的門在眼前--一些要說的東西驴一!
在線代碼編譯工具
官方網(wǎng)站-中文版
基礎(chǔ)教程
早期介紹視頻
暫時(shí)對(duì)databinding的支持不是很友好,一起使用會(huì)出現(xiàn)特別多奇葩的看不懂的錯(cuò)誤灶壶。
butterknife無法使用蛔趴,取而代之的是kotterknife(也是JakeWharton大神的作品)。
轉(zhuǎn)換為Kotlin工程最簡單的方法Tools -> Kotlin -> Configure Kotin in Project例朱。
Code/Conver Java File to Kotlin File單獨(dú)的類轉(zhuǎn)換成Kotlin代碼。
將Java代碼復(fù)制到Kotlin文件會(huì)提示轉(zhuǎn)換也是可以很方便的進(jìn)行差異對(duì)比鱼蝉。
但是有一句說一句哈ide轉(zhuǎn)換出來的kotlin代碼那是給機(jī)器看的 Orz洒嗤。。魁亦。渔隶。。洁奈。间唉。
反射不是很好用,這部分需要引入一個(gè)很大的庫來做利术,BUT 我們可以直接用java寫呈野。
kotlin-ktx
2018年2月5號(hào)的時(shí)候,Google 發(fā)布了一款 Kotlin 的擴(kuò)展庫印叁,叫 Android KTX被冒,它能使 Android 上的 Kotlin 代碼更簡潔,從而提高開發(fā)者的效率和使用體驗(yàn)轮蜕。
Android KTX 其實(shí)就是一個(gè) Kotlin 代碼的擴(kuò)展庫昨悼,Google 把我們開發(fā)的時(shí)候,比較常用的一些代碼塊跃洛,進(jìn)行封裝率触,然后在這個(gè)基礎(chǔ)上,提供更良好的 API汇竭,供開發(fā)者使用葱蝗。
總的來說呢穴张,這個(gè)東西就是java代碼下的xxxUtils庫,但是由于kotlin的 Extensions 特性垒玲,這個(gè)庫可以使用起來有著媲美原生api的使用體驗(yàn)陆馁。
來看看ktx包下面都包括了什么!
[圖片上傳失敗...(image-8d70d4-1527574739510)]
看了之后的感覺是不是很刺激合愈?從animation到text叮贩,從view到net統(tǒng)統(tǒng)都有。
OK廢話咱們就不多說了直接上碼:
github地址
文檔地址