前言
因?yàn)锳ndroid Studio 3.0默認(rèn)支持Kotlin晤柄,所以這里我就省略如何配置Kotlin的環(huán)節(jié),直接進(jìn)入正題擦剑。(關(guān)于如何配置,請看這篇文章)
介紹
Kotlin中的類遵循一個(gè)簡單的結(jié)構(gòu)芥颈。盡管與Java有一點(diǎn)細(xì)微的差別惠勒。你可以在 try.kotlinlang.org 網(wǎng)站測試一些簡單的代碼范例。
怎么定義一個(gè)類
如果你想定義一個(gè)類爬坑,你只需要使用 class 關(guān)鍵字
class MainActivity{
}
它有一個(gè)默認(rèn)唯一的構(gòu)造器纠屋。我們會(huì)在剩下的文章中學(xué)習(xí)在特殊的情況下創(chuàng)建其它額外的構(gòu)造器,但是請記住大部分情況下你只需要這個(gè)默認(rèn)的構(gòu)造器盾计。你只需要在類名后面寫上它的參數(shù)售担。如果這個(gè)類沒有任何內(nèi)容可以省略大括號:
class Person(name: String, surname: String)
那么構(gòu)造函數(shù)的函數(shù)體在哪呢赁遗?你可以寫在 init 塊中:
class Person(name: String, surname: String) {
init{
...
}
}
類繼承
默認(rèn)任何類都是基礎(chǔ)繼承自Any(與java中的Object類似),但是我們可以繼承其它類族铆。所有的類默認(rèn)都是不可繼承的(final)岩四,所以我們只能繼承那些明確聲明 open 或者 abstract 的類:
open class Animal(name: String)
class Person(name: String, surname: String) : Animal(name)
當(dāng)我們只有單個(gè)構(gòu)造器時(shí),我們需要在從父類繼承下來的構(gòu)造器中指定需要的參數(shù)骑素。這是用來替換Java中的 super 調(diào)用的炫乓。
函數(shù)
函數(shù)(我們Java中的方法)可以使用 fun 關(guān)鍵字就可以定義:
fun onCreate(savedInstanceState: Bundle?) {
}
如果你沒有指定它的返回值,它就會(huì)返回 Unit 献丑,與Java中的 void 類似末捣,但
是 Unit 是一個(gè)真正的對象。你當(dāng)然也可以指定任何其它的返回類型:
fun add(x: Int, y: Int) : Int {
return x + y
}
小提示:分號不是必須的
就像你在上面的例子中看到的那樣创橄,我在每句的最后沒有使用分號箩做。當(dāng)然你也可以使用分號,分號不是必須的妥畏,而且不使用分號是一個(gè)不錯(cuò)的實(shí)踐邦邦。當(dāng)你這么做了,你會(huì)發(fā)現(xiàn)這節(jié)約了你很多時(shí)間醉蚁。
然而如果返回的結(jié)果可以使用一個(gè)表達(dá)式計(jì)算出來燃辖,你可以不使用括號而是使用等號:
fun add(x: Int,y: Int) : Int = x + y
構(gòu)造方法和函數(shù)參數(shù)
Kotlin中的參數(shù)與Java中有些不同。如你所見网棍,我們先寫參數(shù)的名字再寫它的類型:
fun add(x: Int, y: Int) : Int {
return x + y
}
我們可以給參數(shù)指定一個(gè)默認(rèn)值使得它們變得可選黔龟,這是非常有幫助的。這里有一個(gè)例子滥玷,在Activity中創(chuàng)建了一個(gè)函數(shù)用來Toast一段信息:
fun toast(message: String, length: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message, length).show()
}
如你所見氏身,第二個(gè)參數(shù)(length)指定了一個(gè)默認(rèn)值。這意味著你調(diào)用的時(shí)候可以傳入第二個(gè)值或者不傳惑畴,這樣可以避免你需要的重載函數(shù):
toast("Hello")
toast("Hello", Toast.LENGTH_LONG)
這個(gè)與下面的Java代碼是一樣的:
void toast(String message){
}
void toast(String message, int length){
Toast.makeText(this, message, length).show();
}
再看看這個(gè)例子:
fun niceToast(message:String,tag:String=javaClass<MainActivity>().getSimpleName(),length: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, "[$className] $message", length).show()
}
我增加了第三個(gè)默認(rèn)值是類名的tag參數(shù)蛋欣。如果在Java中總數(shù)開銷會(huì)以幾何增長。現(xiàn)在可以通過以下方式調(diào)用:
toast("Hello")
toast("Hello", "MyTag")
toast("Hello", "MyTag", Toast.LENGTH_SHORT)
而且甚至還有其它選擇如贷,因?yàn)槟憧梢允褂脜?shù)名字來調(diào)用陷虎,這表示你可以通過在值前寫明參數(shù)名來傳入你希望的參數(shù):
toast(message = "Hello", length = Toast.LENGTH_SHORT)
小提示:String模版
你可以在String中直接使用模版表達(dá)式。它可以幫助你很簡單地在靜態(tài)值和變量的基礎(chǔ)上編寫復(fù)雜的String杠袱。在上面的例子中泻红,我使用了"[$className]$message"。如你所見霞掺,任何時(shí)候你使用一個(gè)$符號就可以插入一個(gè)表達(dá)式。如果這個(gè)表達(dá)式有一點(diǎn)復(fù)雜讹躯,你就需要使用一對大括號括起來:"our firstname is${user.firstname}"菩彬。