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

幼兒園入門

嘀嘀嘀校車來咯--kotlin是啥?了解一哈!

Kotlin 是一種在 Java 虛擬機上運行的靜態類型編程語言,被稱之為 Android 世界的Swift,Kotlin 可以編譯成Java字節碼,也可以編譯成 JavaScript,方便在沒有 JVM 的設備上運行。在Google I/O 2017中,Google 宣布 Kotlin 成為 Android 官方開發語言(那啥此處劃重點--重點了解)。
我覺得這句劃重點的話是我們選擇kotlin的關鍵,當然除了google支持的官方語言,它還有很多優點比如說大大減少樣板代碼的數量避免空指針異常等整個類的錯誤,充分利用 JVM、Android 和瀏覽器的現有庫,可用任何 Java IDE 或者使用命令行構建。

開門上車--kotlin的hello world!

Kotlin 程序文件以 .kt 結尾,如:hello.kt 、world.kt。

class KotlinTest(){
    fun hello(yourName : String){
        println("hello world $yourName")
    }
}
fun main(args: Array<String>) {
    KotlinTest().hello("Licz")
}

老司機平穩上路--基礎語法介紹!

定義基礎

  • 常變量定義
    在Kotlin中常量用val聲明,變量用var聲明,關鍵字還是在名稱前面,類型用”:“隔開在名稱后面,或者也可以直接省略類型直接在名稱后用“=”賦值。
var <標識符> : <類型> = <初始化值>
val <標識符> : <類型> = <初始化值>
  • 空安全定義
    類型后帶“?”表示空安全即可為空,名稱后面帶“?”以及“!!”分別表示可返回null即空安全和拋出空指針異常(簡單理解?可以返回null即表示空安全,!!和java原本的類似,什么都不加編譯器會在相對時刻檢測報錯)
//類型后面加?表示可為空
var age: String? = "23"
//拋出空指針異常
val ages = age!!.toInt()
  • 懶加載
    by lazy{} (多用于單例模式)只能用在val常量類型且只可以初始化一次想要多次初始化只能重新定義, lateinit 只能用在var變量類型并且不能用在java基本類型和可空類型且可以在任何位置初始化并且可以初始化多次
val name: String by lazy { "bestpay" }
lateinit var myTextView: Textview
  • 函數定義
    函數定義使用關鍵字 fun
    幾種示范
fun sum(a: Int, b: Int){   // Int 參數,返回值 Int
    printlb( a + b )
}
fun sum(a: Int, b: Int): Int {   // Int 參數,返回值 Int
    return a + b
}
fun sum(a: Int, b: Int) = a + b
  • 字符串模版
    $ 表示一個變量名或者變量值,$varName 表示變量值,${varName.fun()} 表示變量的方法返回值:
var a = 1
val s1 = "a is $a" 
val s2 = "${s1.replace("is", "was")}, but now is $a" // 解釋一下${}內部可以是函數表達式
  • 類型轉換以及自檢判斷
    is 運算符檢測一個表達式是否某類型的一個實例(類似于Java中的instanceof關鍵字)。
  if (obj is String) {
    // 做過類型判斷以后,obj會被系統自動轉換為String類型
    return obj.length 
  }
  if (obj is String && obj.length > 0)
    return obj.length

基礎數據類型

  • Kotlin 的基本數值類型包括Byte、Short、Int、Long、Float、Double等。不同于Java的是,字符不屬于數值類型,是一個獨立的數據類型。其余基本同java。
  • 注意幾點:
    16 進制以 0x 開頭:0x0F;
    2 進制以 0b 開頭:0b00001011;
    長整型以大寫的 L 結尾:123L;
    Double 默認寫法: 123.5, 123.5e10;
    Float 使用 f 或者 F 后綴:123.5f;
  • 也可以使用下劃線使數字常量更易讀(下劃線無實際意義類似于注釋的意思,怎么看著方便怎么加)
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 中沒有基礎數據類型,只有封裝的數字類型,你每定義的一個變量,其實 Kotlin 幫你封裝了一個對象,這樣可以保證不會出現空指針。數字類型也一樣,所有在比較兩個數字的時候,就有比較數據大小和比較兩個對象是否相同的區別了。在 Kotlin 中,三個等號 === 表示比較對象地址,兩個 == 表示比較兩個值大小。

條件以及循環控制

  • 條件控制

    • if表達式
      和java那一套很類似,不過更強大
val max = if (a > b) a else b //作為表達式,取代了java的三元操作符
  • when表達式
    移除了switch使用更加強大的when代替,when的子式可以是常亮、變量、返回數值的表達式、返回boolean值的表達式,強大到替換if...else if
when (x) {
    1 -> print("x == 1")
    2 -> print("x == 2")
    //類似switch的用法
    3,4 -> print("x == 3 or x == 4")
    //由于沒有break 如果兩個值的處理邏輯一樣可以這樣用“,”隔開
    is String -> x.startsWith("prefix")
    //檢測一個值是(is)或者不是(!is)一個特定類型的值
    else -> { // 注意這個括號
    //注意else相當于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)一個區間(注意區間,這里沒細說)
    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的用法
}
  • 循環控制

    • for循環
      有變化并且多出了幾個變種
for (test in collection) print(test)//可以對任何提供迭代器(iterator)的對象進行遍歷
for (test: Int in ints) {
//循環體是一個代碼塊
    // ……
}
  • while與do...while循環
    基本同java無區別
while( 布爾表達式 ) {
  //循環內容
}
do {
       //代碼語句
}while(布爾表達式);
  • 返回和跳轉
    return:默認從最直接包圍它的函數或者匿名函數返回。
    break:終止最直接包圍它的循環。
    continue:繼續下一次最直接包圍它的循環。
for (i in 1..8) {
        if (i==2) continue  // i 為 2 時跳過當前循環,繼續下一次循環
        println(i)
        if (i>=5) break   // i 為 5 時 跳出循環
    }

類以及對象

  • 簡述
    kotlin的類可以包含的和java代碼的類差不多,有構造函數、內部類、對象聲明、屬性、函數,雖然類型差不多但是形式大大的不一樣。
class Bestpay{ //類名稱 bestpay
     fun writeBug(){println("bug")}
   //大括號內是類內部內容
}
class Empty //定義空類
  • 類屬性
    var聲明可變,val聲明不可變
    注意一點kotlin中是沒有new這個關鍵字的直接在“=”后面寫要實例化的類就可以
    一般要使用一個類屬性或某些方法只要在類后直接“.”屬性名
class Test{ 
     val age : Int = 1
     val name : String = "test"
     fun writeBug(){println("bug")}
}
val bestpay = Test() //注意沒有new關鍵字
bestpay.name
bestpay.age
  • 構造方法
    主構造方法注意constructor關鍵字(可省略)還有init()函數
class Person constructor(firstName: String) {}


class Person (firstName: String) {
//此處沒有注解或者可見性修飾符省略constructor關鍵字
init{
//初始化代碼塊
//參數使用往上看!!! 就是類名稱后面括號里面的東西!!!
firstName == “li”+firstName
}
}

次構造方法也叫做二級構造函數,需要加前綴constructor

class Person { 
    constructor(child: Person) {
        
    }
}


class Person(val name: String) {//主構造函數
    constructor (name: String, age:Int) : this(name) {//次構造函數
        // 初始化...
    }
    class Person(val name: String) {//主構造函數
    constructor (name: String, age:Int,firstName:String) : this(name,age) {//次構造函數
        // 初始化...
    }

注意如果類有主構造函數,每個次構造函數都要,或直接或間接通過另一個次構造函數代理主構造函數。在同一個類中代理另一個構造函數使用this關鍵字。

  • 抽象類
    abstract關鍵字了解一哈
  • 內部類
    內部類使用 inner 關鍵字來表示。
    內部類會帶有一個對外部類的對象的引用,所以內部類可以訪問外部類成員屬性和成員函數。
class Test {
  val inn = "123"
    inner  class  innerTest{
        fun innertest(){
            var t =this@Test
            t.inn.equals(inn)
        }
    }
}
  • 嵌套類
    內部類包含嵌套類,嵌套類沒有inner關鍵字

  • 匿名內部類
    定義和java類似,沒有名字直接實例化使用,常用于接口等回調。

class Test {
    var v = "成員屬性"

    fun setInterFace(test: TestInterFace) {
        test.test()
    }
}

/**
 * 定義接口
 */
interface TestInterFace {
    fun test()
}

fun main(args: Array<String>) {
    var test = Test()

    /**
     * 采用對象表達式來創建接口對象,即匿名內部類的實例。
     */
    test.setInterFace(object : TestInterFace {
    //注意此處接口的調用方式
        override fun test() {
            println("對象表達式創建匿名內部類的實例")
        }
    })
}
  • 類修飾符
    • classModifier: 類屬性修飾符,標示類本身特性。
      abstract // 抽象類
      final // 類不可繼承,默認屬性
      enum // 枚舉類
      open // 類可繼承,類默認是final的
      annotation // 注解類
  • accessModifier: 訪問權限修飾符
    private // 僅在同一個文件中可見
    protected // 同一個文件中或子類可見
    public // 所有調用的地方都可見(默認修飾符,什么都不加就是public)
    internal // 同一個模塊中可見(包內可見)
  • 多嘴一句注意data類它是kotlin中特有的bean類用來寫pojo超級方便
data class User(val name: String, val age: Int)

data class TestData(@SerializedName("success") var success: String, @SerializedName("errorCode") var errorCode: String) {
}

就這樣簡單的一個data class,加上主構造函數就構成了kotlin的特有pojo類它有編譯器自動生成的equals()/hashCode()方法、toString()方法、componentN()方法、copy()方法以及“set/get”等方法。

一些補充

  • “:”冒號的妙用 類的繼承、聲明常變量的類型、函數的返回值等都有它的身影,除了以上還有Kotlin最終會還是編譯成Java字節碼,使用到Java類是必然的也是要用到“:”冒號的
val intent = Intent(this, Test::class.java)
  • 除了冒號還有一個較重要的符號@,this后面加上@對象表明指返回哪一個(內部類return處多用)
class User {
    inner class FamilyUser{
        fun getUser(): User{
            //返回User
            return this@User
        }
        fun getFamilyUser(): FamilyUser{
            //返回FamilyUser
            return this@FamilyUser
        }
    }
}

到站下車幼兒園的門在眼前--一些要說的東西!

在線代碼編譯工具
官方網站-中文版
基礎教程
早期介紹視頻

  • 暫時對databinding的支持不是很友好,一起使用會出現特別多奇葩的看不懂的錯誤。

  • butterknife無法使用,取而代之的是kotterknife(也是JakeWharton大神的作品)。

  • 轉換為Kotlin工程最簡單的方法Tools -> Kotlin -> Configure Kotin in Project。

  • Code/Conver Java File to Kotlin File單獨的類轉換成Kotlin代碼。

  • 將Java代碼復制到Kotlin文件會提示轉換也是可以很方便的進行差異對比。

  • 但是有一句說一句哈ide轉換出來的kotlin代碼那是給機器看的 Orz。。。。。。。

  • 反射不是很好用,這部分需要引入一個很大的庫來做,BUT 我們可以直接用java寫。


kotlin-ktx

2018年2月5號的時候,Google 發布了一款 Kotlin 的擴展庫,叫 Android KTX,它能使 Android 上的 Kotlin 代碼更簡潔,從而提高開發者的效率和使用體驗。
Android KTX 其實就是一個 Kotlin 代碼的擴展庫,Google 把我們開發的時候,比較常用的一些代碼塊,進行封裝,然后在這個基礎上,提供更良好的 API,供開發者使用。
總的來說呢,這個東西就是java代碼下的xxxUtils庫,但是由于kotlin的 Extensions 特性,這個庫可以使用起來有著媲美原生api的使用體驗。
來看看ktx包下面都包括了什么!

[圖片上傳失敗...(image-8d70d4-1527574739510)]

看了之后的感覺是不是很刺激?從animation到text,從view到net統統都有。
OK廢話咱們就不多說了直接上碼:
github地址
文檔地址


關于應用Kotlin后的編譯速度問題

此處直接引用一篇文章

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容