在kotlin中一切都是對(duì)象孔庭,沒(méi)有Java中的原始基本類(lèi)型睦尽,可以用一致的方式來(lái)處理可用的類(lèi)型
3.1 基本類(lèi)型
數(shù)字類(lèi)型中不會(huì)自動(dòng)轉(zhuǎn)型孕惜,必須要做一個(gè)明確的類(lèi)型轉(zhuǎn)換
val i: Int = 7
val d: Double = i.toDouble()
字符(Char)不能直接作為一個(gè)數(shù)字來(lái)處理履怯,用toInt來(lái)轉(zhuǎn)換
val c: Char = 'c'
val i: Int = c.toInt()
位運(yùn)算在java和kotlin之間的不同富稻,例:(還有其他很多的微操作符画切,如shl东涡、shs隆嗅、ushr错忱、xor)
//Java
int bitwiseOr = Flag1 | Flag2;
int bitwiseAnd = Flag1 & Flag2;
//Kotlin
val bitwiseOr = Flag1 or Flag2
val bitwiseAnd = Flag1 And Flag2
變量的類(lèi)型不是必須寫(xiě)明的儡率,可以讓編譯器自己去推斷
val i = 12
val iHex = 0x0f
val l = 3L
val d = 3.5
val f = 3.5F
一個(gè)String可以像數(shù)組那樣訪問(wèn)
val s = "Example"
val c = s[2]//'a'
3.2 變量
變量可以很簡(jiǎn)單地定義成可變(var)和不可變(val)的變量,不可變對(duì)象意味著實(shí)例化之后不能改變狀態(tài)了以清《眨可以說(shuō)不可變對(duì)象是線程安全的,盡可能的用(val)聲明變量
3.3 屬性
kotlin中的屬性是默認(rèn)加上了getter和setter的
public class Person {
var name: String = ""
}
val person = Person()
//對(duì)象.屬性名就是對(duì)象.set或者get屬性名
person.name = "name"
val name = person.name
當(dāng)然掷倔,也可以自定義getter和setter
public class Person {
var name: String = ""
//在自定義getter和setter時(shí)訪問(wèn)自身的值眉孩,需要?jiǎng)?chuàng)建一個(gè)backing field,可以使用field這個(gè)預(yù)留字段來(lái)訪問(wèn)
//field只能在屬性訪問(wèn)器內(nèi)訪問(wèn)
get() = field.toUpperCase()
set(value) {
field = "Name: $value"
}
}
3.4 開(kāi)始使用Anko
Anko是JetBrains開(kāi)發(fā)的一個(gè)強(qiáng)大的庫(kù)勒葱。它主要的目的是用來(lái)替代以前XML的方式使用代碼生成UI布局
配置Anko庫(kù):
在依賴(lài)中添加
implementation "org.jetbrains.anko:anko-common:0.10.5"
implementation 'org.jetbrains.anko:anko-sdk25:0.10.5'
使用Anko初始化布局
//使用anko簡(jiǎn)化代碼浪汪,如實(shí)例化Intent、Activity之間的跳轉(zhuǎn)凛虽、Fragment的創(chuàng)建死遭、數(shù)據(jù)庫(kù)的訪問(wèn)等
val forecastList: RecyclerView = find(R.id.forecast_list)
3.5 擴(kuò)展函數(shù)
擴(kuò)展函數(shù)是指在一個(gè)類(lèi)上增加一種新的行為,我們?cè)谡{(diào)用方法的時(shí)候不需要把整個(gè)對(duì)象都當(dāng)作參數(shù)傳入凯旋。擴(kuò)展函數(shù)就像是屬于這個(gè)類(lèi)一樣呀潭,而且可以使用this關(guān)鍵字和調(diào)用public方法。擴(kuò)展函數(shù)不是真正的修改一個(gè)類(lèi)至非,而是以靜態(tài)導(dǎo)入的方式來(lái)實(shí)現(xiàn)的钠署,它可以聲明在任何文件里。
//創(chuàng)建一個(gè)toast函數(shù)荒椭,這個(gè)函數(shù)不需要傳入任何context谐鼎,它可以被任何Context或者它的子類(lèi)調(diào)用
fun Context.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, duration).show()
}
toast("hello world")
toast("hello world", Toast.LENGTH_SHORT)
//擴(kuò)展函數(shù)也可以用來(lái)擴(kuò)張屬性
public var TextView.text: CharSequence
get() = getText()
set(value) = setText(value)
3.6 執(zhí)行一個(gè)請(qǐng)求
//簡(jiǎn)單的創(chuàng)建一個(gè)請(qǐng)求類(lèi)
public class Request(val url: String) {
public fun run() {
val forecastJsonStr = URL(url).readText()
Log.d(javaClass.simpleName, forecastJsonStr)
}
}
//Anko提供了一個(gè)基本的 async 函數(shù)用于在其它線程執(zhí)行代碼,也可以選擇通過(guò)調(diào)用 uiThread 的 方式回到主線程
doAsync() {
Request(url).run()
uiThread { longToast("Request performed") }
}