Kotlin基础

📅 2026/8/13 10:44:43
Kotlin基础
类型系统、setter和getter、构造器等is 判断类型 相当于java的instanceof as 强转类型 相当于java的 Type在kotlin中获取class对象LessonActivity::class 获取的是kotlin对象LessonActivity::class.java获取的是java的对象set和get如下注释代码是默认的不需要写的使用了var关键字如果set和get有特殊逻辑才需要写但是怎么把set设置为私有、外部调用不了呢如下在java中直接访问kotlin的成员变量可以在kotlin变量中加JvmField生成就是一个公开的并且没有set和get方法。java基类是Objectkotlin是Any同时Any没有wait、notify等方法kotlin继承类的时候并不一定要加(), 只要有写一个构造函数就可以不写()openclassPerson{}// 这里Person后面不用()classUser:Person{constructor()}arrayOf方法来声明基本类型的数组比如int会有拆装箱性能问题此时可以用intArrayOf解决其他基本类型类似静态函数、注解、单例1.顶层包级函数或属性 直接把函数或者属性定义在文件中。其实会被编译这个文件的静态函数和属性2.对象声明 object className 作用是单例kotlin可以直接通过类名调用java都是通过实例调用3.伴生对象companion object, 也是一个单例对象kotlin可以直接通过类名调用java都是通过实例调用4.object: className {}, 匿名内部类5.区间可以使用in表示比如 code in 200…299 是一个闭区间6.when相当于java的switch关键字的作用但是when的分支支持表达式而不仅仅字段值.。另外when是可以有返回值的internal、enum1.枚举enum class className, 这里需要两个关键字enumclassState{PLAY{overridefunstateName():String{return1}},PAUSE{overridefunstateName():String{return2}};// 抽象方法需要枚举实例自实现abstractfunstateName():String}2.java通过MainActivity.this, 这里this来获取外部的对象的kotlin则是通过thisMainActivity3.List是不可修改的数组如果要修改可以用arrayListOf 或者mutableListvallistmutableListOfInt()4.java默认是内部类是嵌套内部类除非显示声明static才是静态内部类。5.kotlin默认是静态内部类如果是要嵌套内部类则需要声明inner class6.internal关键字表示当前模块可用外部模块不可用。比如开发的sdk内部可用但是不希望暴露出去java做不到只能声明为publicinternal还可以用在方法、属性等7.普通类默认是final的如果要可以被继承需要加open或者abstract构造、数据类及反编译主构造函数写在类名处以及内部使用init初始化还可以简化成通过var 字段变成了一个成员属性从构造函数的声明需要调用主构造函数如下classTestClassconstructor(varuserName:String?null){// 调用主构造函数constructor():this(test){}}数据类data class数据类会有copy、equals(等同于)、hashCode等方法注意是对比值、 是强制比较地址值即是否同个对象另外如下示例返回的是数据类可以用val () 来表示操作符、循环、中缀表示法通过:?设置默认值遍历数组遍历红框2可以替代红框1在lambda中由于只有一个参数所以可以不写直接有it表示唯一的参数另外可以由filter实现循环repeat函数for(i in 0…200) 左右闭区间for(i in 0 until array.size) 左必右开嵌套函数、函数简化、参数默认值、扩展函数嵌套函数函数简化因为函数只有一行可以省略返回类型并且用等号。如果函数没有返回值也是同样写法参数默认值可以应对方法重载过多的问题可以设置默认值的话就可以简化成一个方法扩展函数: 这里通过Float.对浮点数声明扩展函数里面使用this表示浮点值。如果对已有的系统方法写相同扩展是无效的。通过反编译可以知道扩展函数 其实 就是静态方法方法参数之一就是被扩展对象扩展属性inline、函数类型、reifiedinline内联函数就是把函数的实现拷贝到调用的地方。意义可以减少一层调用栈但是也增加了编译时间。函数类型listener是参数名后面表示是一个函数类型这里有到-箭头后面跟着是返回类型还可以再简化去掉view字段名内联函数被推荐使用在参数是函数类型的时候通过反编译可以看到这种情况使用非内联函数的话每次都会创建一个对象频繁调用有性能损耗。内联的话则是直接拷贝代码过去没有这个问题。reified的是用最初的调用通过inline reified的可以拿到T的类型这里inline帮助直接使用泛型by关键字原理 委托首次调用才是执行到lazy的lambda。另外by还可以如下委托减少重复代码即可以复用代码还支持传参作用域函数apply、let、with、also、run、区别返回类型不同、作用域内部是使用this还是itlet最后一行是返回值这里还需要手动返回itapply不需要手动返回因为默认返回的是this意义通过作用域函数可以分割代码把相同逻辑都写在同一个作用域不然我们平常写代码都是用空行来分割下。