美文网首页
kotlin学习记录

kotlin学习记录

作者: 陈萍儿Candy | 来源:发表于2021-02-16 20:48 被阅读0次

    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<String>("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<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是一个表达式,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<Int,String>(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学习记录

          本文链接:https://www.haomeiwen.com/subject/sqzpxltx.html