kotlin入門教程(幼兒園的門)

幼兒園入門

嘀嘀嘀校車來咯--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)大
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 (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 // 注解類
  • 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地址
文檔地址


關(guān)于應(yīng)用Kotlin后的編譯速度問題

此處直接引用一篇文章

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末佛析,一起剝皮案震驚了整個(gè)濱河市益老,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌寸莫,老刑警劉巖捺萌,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異膘茎,居然都是意外死亡桃纯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門披坏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來态坦,“玉大人,你說我怎么就攤上這事棒拂∩√荩” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵帚屉,是天一觀的道長谜诫。 經(jīng)常有香客問我,道長攻旦,這世上最難降的妖魔是什么喻旷? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮敬特,結(jié)果婚禮上掰邢,老公的妹妹穿的比我還像新娘。我一直安慰自己伟阔,他們只是感情好辣之,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著皱炉,像睡著了一般怀估。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天多搀,我揣著相機(jī)與錄音歧蕉,去河邊找鬼。 笑死康铭,一個(gè)胖子當(dāng)著我的面吹牛惯退,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播从藤,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼催跪,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了夷野?” 一聲冷哼從身側(cè)響起懊蒸,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎悯搔,沒想到半個(gè)月后骑丸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妒貌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年通危,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灌曙。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黄鳍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出平匈,到底是詐尸還是另有隱情,我是刑警寧澤藏古,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布增炭,位于F島的核電站,受9級(jí)特大地震影響拧晕,放射性物質(zhì)發(fā)生泄漏隙姿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一厂捞、第九天 我趴在偏房一處隱蔽的房頂上張望输玷。 院中可真熱鬧,春花似錦靡馁、人聲如沸欲鹏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赔嚎。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尤误,已是汗流浹背侠畔。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留损晤,地道東北人软棺。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像尤勋,于是被迫代替她去往敵國和親喘落。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容