kotlin学习记录

1.Array. 等价java中的数组类型
2.kotlin类中声明的成员变量(无论是var/val)都必须初始化,或者使用lateinit修饰,在后面使用前初始化,这和java不一样,防止出现NullPointException;
但是在kotlin函数中的局部变量是可以不用初始化,编译可以通过;
还有一种,可以通过自定义访问器给属性赋值

class Student(val name: String, var age: Int) {
   // 自定义属性访问器
   val isSquare: Boolean
       get() {
           return name == "lala"
       }
}

3.创建kotlin的文件时会有一个选择,file,class,这个两个的区别是,如果这个文件有并排的两个class,这个文件就是xxx.kt,如果只有这一个class,文件为xxx


image.png

image.png

创建kotlin文件时一般选择类型为class,后续如果有并排的class会自动转换为file类型,增加.kt
后缀
4.if在kotlin中是表达式,有返回值,when是类似java中的switch,但是when也是表达式,有返回值,他们会把最后一个表达式会被作为结果返回;
when中没有break,不会穿透执行,如果需要多个值匹配,需要值之间用“,"分隔开,when允许使用任何对象作为作为分支条件,不像java必须是常量(枚举常量,字符串或者数字);when还可以不用带参数;

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有一个set集合:https://www.jianshu.com/p/3c95d7729d69
集合的遍历:

fun testSet(){
       // setOf返回的是不可变的有序的集合
        val  set = setOf("2","3")
        // for + in 是对set集合的遍历
        for (name in set) {
            println(name)
        }
    }

6.is 相当于java中的instanceOf,不同之处,java中需要显示的类型转换后才能使用,如果需要多次使用需要用局部变量保存,kotlin不需要

fun testIs(stu: Fu){
        // is 相当于java中的instanceOf,不同之处,java中需要显示的类型转换后才能使用,如果需要多次使用需要用局部变量保存,kotlin不需要
        if (stu is Stu) {
            // 能访问的属性必须是一个val属性,不能有自定义的访问器,否则不能保证每次返回同样的值
            println(stu.a)
        }
        // 特定类型的显示转换
        val stu1 = stu as Stu
        println(stu1.a)
    }

7.for循环遍历

fun testFor(){
        val array = IntArray(4)
        // array这个数组的下标
        for (i in array.indices){

        }
        // 包含右边的结束值的区间
        for (i in 100 downTo 1 step 2) {

        }
        // until 不包含100的区间
        for (i in 1 until 100) {

        }

        val treeMap:TreeMap = 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(3,5)
        for ((index,element) in list.withIndex()) {

        }

        
    }

8.trow,try是一个表达式,if/when(switch)也是表达式

val percentage = 0
        if (percentage !in 0..100) {
            // throw是一个表达式
            throw IllegalArgumentException("")
        }

        // try是一个表达式
        // 如果一个try代码块执行一切正常代码块中的最后一个表达式就是结果,如果捕获了异常,相应的catch代码块中最后一个表达式就是结果
        val number = try {
            Integer.parseInt("34")
        } catch (e:NumberFormatException) {
            return
        }

        println(number)

9.扩展函数,是静态函数,在java中可以通过文件名.方法名,直接调用,扩展函数不能被重写
扩展函数是写在类的外面


image.png

使用是,可以import这个函数;

10.to函数 中缀调用,能以中缀调用的函数需要用infix修饰, 处理单个参数的函数;

 // to 中缀调用  to函数有infix修饰
        val map = hashMapOf(1 to "one",7 to "seven")

11.kotlin中的String增加了一些扩展方法,还可以继续使用正则表达式,三重引号的字符串可以避免转义字符,可以包含任何字符;
12.嵌套的类默认不是内部类:他们并没有包含对其外部类的隐式引用;kotlin有一个可以声明类并创建这个类的一个实例的object关键字(类似于java的匿名类);使用:代替java中的extends/implements关键字;同java一样,一个类可以实现多个接口,但只能继承一个类;
kotlin中,接口里可以有默认方法(提供了方法体),但是java中没有这样的语法,java中如果继承了kotlin的接口,必须实现所有的方法;

12.修饰符:

class DataModel {

    var name: String? = null  // ??
    lateinit var name1: String
    val age: Int = 2
    // 先走init,再走constructor,这两个
     init {
        println("init: ")
    }
// 
    constructor() {
        println(": constructor")
    }
    fun setup() {
       // name1初始化,使用name1之前必须先调用这个方法进行初始化,否则报异常
        name1 = "lala"
    }
}

你可能感兴趣的:(kotlin学习记录)