Kotlin之類和函數(shù)

類和函數(shù)

Kotlin中的類遵循一個(gè)簡單的結(jié)構(gòu)。盡管與Java有一點(diǎn)細(xì)微的差別。你可以使用try.kotlinlang.org在不需要一個(gè)真正的項(xiàng)目和不需要部署到機(jī)器的前提下來測試一些簡單的代碼范例。

怎么定義一個(gè)類

如果你想定義一個(gè)類,你只需要使用class關(guān)鍵字。

class MainActivity{

}

它有一個(gè)默認(rèn)唯一的構(gòu)造器。我們會(huì)在以后的課程中學(xué)習(xí)在特殊的情況下創(chuàng)建其它額外的構(gòu)造器,但是請(qǐng)記住大部分情況下你只需要這個(gè)默認(rèn)的構(gòu)造器。你只需要在類名后面寫上它的參數(shù)。如果這個(gè)類沒有任何內(nèi)容可以省略大括號(hào):

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è)真正的對(duì)象。你當(dāng)然也可以指定任何其它的返回類型:

fun add(x: Int, y: Int) : Int {
    return x + y
}

小提示:分號(hào)不是必須的

就像你在上面的例子中看到的那樣,我在每句的最后沒有使用分號(hào)。當(dāng)然你也可以使用分號(hào),分號(hào)不是必須的,而且不使用分號(hào)是一個(gè)不錯(cuò)的實(shí)踐。當(dāng)你這么做了,你會(huì)發(fā)現(xiàn)這節(jié)約了你很多時(shí)間。

然而如果返回的結(jié)果可以使用一個(gè)表達(dá)式計(jì)算出來,你可以不使用括號(hào)而是使用等號(hào):

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();
}

這跟你想象的一樣復(fù)雜。再看看這個(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ì)以幾何增長?,F(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è) 符號(hào)就可以插入一個(gè)表達(dá)式。如果這個(gè)表達(dá)式有一點(diǎn)復(fù)雜,你就需要使用一對(duì)大括號(hào)括起來:"Your name is{user.name}"。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 小學(xué)時(shí),我們都學(xué)過,兩點(diǎn)之間,線段最短。 數(shù)學(xué)一直不好,但單單這條定理成為辦事原則,行為準(zhǔn)繩。 一件事情,如果不能...
    迷途知返的兔子閱讀 450評(píng)論 0 1
  • 最近學(xué)String,講到了一些例子,記錄一下吧。(后續(xù)把py的補(bǔ)上) 視頻地址:https://www.bilib...
    0error_閱讀 970評(píng)論 0 0
  • 今天是什么日子 起床:6:00 天氣:晴 心情:好 紀(jì)念日:無 叫我起床的不是鬧鐘是夢(mèng)想 年度目標(biāo)及關(guān)鍵點(diǎn): *家...
    古閱育兒閱讀 192評(píng)論 0 0
  • 喂貓成為日常之后,這一家五口就認(rèn)準(zhǔn)了我這個(gè)喂糧官。對(duì)的,只是喂糧,他們?cè)谛^(qū)里到處浪,自己找?guī)€會(huì)自己找水喝,我...
    武廿七閱讀 574評(píng)論 0 4
  • 日常法律分享 俗話說的好呀“親兄弟明算賬!”錢得借,借條也得要啊~(好尬的開場,總之就是從律師角度說凡事都要保留證...
    2037d25f1baf閱讀 470評(píng)論 0 1

友情鏈接更多精彩內(nèi)容