Kotlin-学习笔记-注意事项(一)

mac2024-04-08  36

1 三重引号(""")

模板 里面可以包含任意字符 ,包括双引号,单引号,换行,会车,反斜杠等不能直接写在字符串双引号里面的字符 主要是用来方便复制HTML,JavaScript代码

2 is运算符进行类型检测

is做过类型判断以后,变量会被系统自动转换为 推断类型

fun getStringLength(obj :Any):Int?{ if (obj is String) { // 做过类型判断以后,obj会被系统自动转换为String类型 return obj.length } // 这里的obj仍然是Any类型的引用 return null }
3 vararg 可变参数
fun vars(vararg v: Int) {//可变参数 --》相当于数组 for (vt in v) { print(vt) } }
4 扩展函数不可覆盖(overriding)

扩展函数是静态解析的,并不是接收者类型的虚拟成员。 调用哪一个扩展函数,是由调用函数的对象表达式决定的,而不是动态类型决定的 如下官方文档的例子

open class View { open fun click() = println("View clicked") } class Button: View() { override fun click() = println("Button clicked") } fun View.showOff() = println("I'm a view!") fun Button.showOff() = println("I'm a button!")

执行结果

fun main(args: Array<String>) { val view: View = Button() view.click() //Button clicked view.showOff() //I'm a view! }

方法的覆盖(overriding)对类中的成员函数是有效的,但是扩展函数不能被覆盖 click 是类中的成员函数,可重写,父类 类型指向子类对象,调用子类函数(类的多态) showOff 是扩展函数,扩展函数并不是类的一部分,他们申明在类的外部,被调用的函数依赖已被申明的静态类型。

5 Kotlin 没有三元表达式

Kotlin 没有三元表达式,一般用if表达式替代 如Java : Int num = 2>1 ? 2:1 可用Kotlin : var num = if (2>1) 2 else 1

6 Elvis操作符 ?:

主要用于null的安全检查,Elvis操作符是一个二元运算符,如果第一个操作数不为null,返回自己,否则返回第二个操作数。 如Java : String displayName = name !=null ? name : “unknown”; Kotlin : val displayName = name?:“unkown”

7 NULL检查机制

Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式, 1 字段后加 !!. 像Java一样抛出空异常, 2 另一种字段后加 ?. 可不做处理返回值为 null或配合?:做空判断处理

//类型后面加?表示可为空 var age: String? = null //抛出空指针异常 val ages = age!!.toInt() //不做处理返回 null val ages1 = age?.toInt() //age为空返回-1 val ages2 = age?.toInt() ?: -1
8 Kotlin 八进制不支持

十进制:123 十六进制以 0x 开头:0x0F 二进制以 0b 开头:0b00001011 注意:Kotlin 八进制不支持

9 比较两个数字

Kotlin 中没有基础数据类型,只有封装的数字类型,你每定义的一个变量,其实 Kotlin 帮你封装了一个对象,这样可以保证不会出现空指针。数字类型也一样,所有在比较两个数字的时候,就有比较数据大小和比较两个对象是否相同的区别了。

在 Kotlin 中,三个等号 === (或 !==)表示比较对象地址,(引用相等:两个无关联的对象指向了内存中的同一个实例) 两个 == (或!=)表示比较两个值大小。(结构相等:两个对象分别位于内存中的不同地址但他们但值却是相同的)

10 单例

java 单例的写法一般有5种,相对于的Kotlin 也是5种 1 最简单写法

object +class

也就是饿汉式(线程安全,调用效率高,但是不能延时加载): 不推荐这种实现方式 2 内部静态类写法- 推荐写法 (线程安全,调用效率高,可以延时加载)

class LazyThreadSafeStaticInnerObject private constructor(){ companion object { fun getInstance() = SingletonHolder.holder } private object SingletonHolder{ var holder = LazyThreadSafeStaticInnerObject() } }

3 枚举类写法 (线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用)

enum class Singleton { //枚举元素本身就是单例 INSTANCE; //添加自己需要的操作 fun singletonOperation() {} }

参考如下 -相当详细,当做复习 Kotlin扩展函数和扩展属性笔记 Kotlin下的5种单例模式 Kotlin教程

最新回复(0)