kotlin學(xué)習(xí)記錄

1.Array. 等價(jià)java中的數(shù)組類型
2.kotlin類中聲明的成員變量(無論是var/val)都必須初始化,或者使用lateinit修飾,在后面使用前初始化,這和java不一樣,防止出現(xiàn)NullPointException;
但是在kotlin函數(shù)中的局部變量是可以不用初始化,編譯可以通過;
還有一種,可以通過自定義訪問器給屬性賦值

class Student(val name: String, var age: Int) {
   // 自定義屬性訪問器
   val isSquare: Boolean
       get() {
           return name == "lala"
       }
}

3.創(chuàng)建kotlin的文件時(shí)會有一個(gè)選擇,file,class,這個(gè)兩個(gè)的區(qū)別是,如果這個(gè)文件有并排的兩個(gè)class,這個(gè)文件就是xxx.kt,如果只有這一個(gè)class,文件為xxx


image.png

image.png

創(chuàng)建kotlin文件時(shí)一般選擇類型為class,后續(xù)如果有并排的class會自動(dòng)轉(zhuǎn)換為file類型,增加.kt
后綴
4.if在kotlin中是表達(dá)式,有返回值,when是類似java中的switch,但是when也是表達(dá)式,有返回值,他們會把最后一個(gè)表達(dá)式會被作為結(jié)果返回;
when中沒有break,不會穿透執(zhí)行,如果需要多個(gè)值匹配,需要值之間用“,"分隔開,when允許使用任何對象作為作為分支條件,不像java必須是常量(枚舉常量,字符串或者數(shù)字);when還可以不用帶參數(shù);

fun testWhen(num: KotlinEnum) {
       val value = when (num) {
           KotlinEnum.RED,KotlinEnum.BLUE -> "k"
           else -> "else"
       }
       println("when:is $value")
   }


fun whenTest(num1: KotlinEnum,num2: KotlinEnum){
       when  {
           num1 == KotlinEnum.BLUE && num2 == KotlinEnum.RED ||
               num1 == KotlinEnum.RED && num2 == KotlinEnum.BLUE -> 1
           else -> 2
       }
   }

5.Set集合,kotlin有一個(gè)set集合:http://www.itdecent.cn/p/3c95d7729d69
集合的遍歷:

fun testSet(){
       // setOf返回的是不可變的有序的集合
        val  set = setOf<String>("2","3")
        // for + in 是對set集合的遍歷
        for (name in set) {
            println(name)
        }
    }

6.is 相當(dāng)于java中的instanceOf,不同之處,java中需要顯示的類型轉(zhuǎn)換后才能使用,如果需要多次使用需要用局部變量保存,kotlin不需要

fun testIs(stu: Fu){
        // is 相當(dāng)于java中的instanceOf,不同之處,java中需要顯示的類型轉(zhuǎn)換后才能使用,如果需要多次使用需要用局部變量保存,kotlin不需要
        if (stu is Stu) {
            // 能訪問的屬性必須是一個(gè)val屬性,不能有自定義的訪問器,否則不能保證每次返回同樣的值
            println(stu.a)
        }
        // 特定類型的顯示轉(zhuǎn)換
        val stu1 = stu as Stu
        println(stu1.a)
    }

7.for循環(huán)遍歷

fun testFor(){
        val array = IntArray(4)
        // array這個(gè)數(shù)組的下標(biāo)
        for (i in array.indices){

        }
        // 包含右邊的結(jié)束值的區(qū)間
        for (i in 100 downTo 1 step 2) {

        }
        // until 不包含100的區(qū)間
        for (i in 1 until 100) {

        }

        val treeMap:TreeMap<Char,String> = TreeMap()
        // map,通過map[key] 來讀取值 ,map[key] = value 賦值,不用通過put,get方法
        treeMap['a'] = "aaaa"
        treeMap['b'] = "bbbb"
        // treemap的遍歷
        for ((key,value) in treeMap) {
            println("$key = $value")
        }

        val list = arrayListOf<Int>(3,5)
        for ((index,element) in list.withIndex()) {

        }

        
    }

8.trow,try是一個(gè)表達(dá)式,if/when(switch)也是表達(dá)式

val percentage = 0
        if (percentage !in 0..100) {
            // throw是一個(gè)表達(dá)式
            throw IllegalArgumentException("")
        }

        // try是一個(gè)表達(dá)式
        // 如果一個(gè)try代碼塊執(zhí)行一切正常代碼塊中的最后一個(gè)表達(dá)式就是結(jié)果,如果捕獲了異常,相應(yīng)的catch代碼塊中最后一個(gè)表達(dá)式就是結(jié)果
        val number = try {
            Integer.parseInt("34")
        } catch (e:NumberFormatException) {
            return
        }

        println(number)

9.擴(kuò)展函數(shù),是靜態(tài)函數(shù),在java中可以通過文件名.方法名,直接調(diào)用,擴(kuò)展函數(shù)不能被重寫
擴(kuò)展函數(shù)是寫在類的外面


image.png

使用是,可以import這個(gè)函數(shù);

10.to函數(shù) 中綴調(diào)用,能以中綴調(diào)用的函數(shù)需要用infix修飾, 處理單個(gè)參數(shù)的函數(shù);

 // to 中綴調(diào)用  to函數(shù)有infix修飾
        val map = hashMapOf<Int,String>(1 to "one",7 to "seven")

11.kotlin中的String增加了一些擴(kuò)展方法,還可以繼續(xù)使用正則表達(dá)式,三重引號的字符串可以避免轉(zhuǎn)義字符,可以包含任何字符;
12.嵌套的類默認(rèn)不是內(nèi)部類:他們并沒有包含對其外部類的隱式引用;kotlin有一個(gè)可以聲明類并創(chuàng)建這個(gè)類的一個(gè)實(shí)例的object關(guān)鍵字(類似于java的匿名類);使用:代替java中的extends/implements關(guān)鍵字;同java一樣,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但只能繼承一個(gè)類;
kotlin中,接口里可以有默認(rèn)方法(提供了方法體),但是java中沒有這樣的語法,java中如果繼承了kotlin的接口,必須實(shí)現(xiàn)所有的方法;

12.修飾符:

class DataModel {

    var name: String? = null  // ??
    lateinit var name1: String
    val age: Int = 2
    // 先走init,再走constructor,這兩個(gè)
     init {
        println("init: ")
    }
// 
    constructor() {
        println(": constructor")
    }
    fun setup() {
       // name1初始化,使用name1之前必須先調(diào)用這個(gè)方法進(jìn)行初始化,否則報(bào)異常
        name1 = "lala"
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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