type
status
date
slug
summary
tags
category
password
icon

静态函数和属性

  • 顶层函数
  • object
  • companion object
其中,「顶层函数」直接在⽂件中定义函数和属性,会直接⽣成静态的,在 Java 中通过「⽂件名Kt」来 访问,同时可以通过 @file:JvmName 注解来修改这个「类名」。
需要注意,这种顶层函数不要声明在 module 内最顶层的包中,⾄少要在⼀个包中例如 com 。不然不能⽅便使⽤。
object 和 companion object 都是⽣成单例例对象,然后通过单例对象访问函数和属性的。

@JvmStatic

通过这个注解将 object 和 companion object 的内部函数和属性,真正⽣成为静态的。

@JvmField 生成属性

通过 @JvmField 注解可以让编译器只⽣成⼀个 public 的成员属性,不⽣成对应的setter/getter 函数
 

内部类

在 Kotlin 当中,内部类默认是静态内部类 通过 inner 关键字声明为嵌套内部类

可⻅性修饰符

默认的可⻅性修饰符是 public 新增的可⻅性修饰符 internal 表示当前模块可⻅

注释

注释中可以在任意地⽅使⽤ [] 来引⽤⽬标,代替 Java 中的 @param @link 等。

⾮空断⾔

可空类型强制类型转换成不可空类型可以通过在变量后⾯加上 !! ,来达到类型转换。

open/final

Kotlin 中的类和函数,默认是被 final 修饰的 ( abstractoverride 例外)

相等性

  • == 结构相等(调用equals()比较)
  • === 引用(地址值)相等
 

operator

通过 operator 修饰「特定函数名」的函数,例如 plusget ,可以达到重载运算符的效果

infix 函数

必须是成员函数或扩展函数
必须只能接受⼀个参数,并且不能有默认值
 

注解使⽤处⽬标

当某个元素可能会包含多种内容(例如构造属性,成员属性),使⽤注解时可以通过「注解使⽤处⽬标」,让注解对⽬标发⽣作⽤,例如 @file:@get:@set: 等。
 

扩展

  • 扩展函数可以为任何类添加上⼀个函数,从⽽代替⼯具类
  • 扩展函数和成员函数相同时,成员函数优先被调⽤
  • 扩展函数是静态解析的,在编译时就确定了调⽤函数(没有多态)
 

内联函数

  • 内联函数配合「函数类型」,可以减少「函数类型」⽣成的对象
  • 使⽤ inline 关键字声明的函数是「内联函数」,在「编译时」会将「内联函数」中的函数体直接插⼊到调⽤处。所以在写内联函数的时候需要注意,尽量将内联函数中的代码⾏数减少!
  • 部分禁⽤⽤内联 noinline 可以禁⽌部分参数参与内联编译

具体化的类型参数

因为内联函数的存在,我们可以通过配合 inline + reified 达到「真泛型」的效果

函数参数默认值

可以通过函数参数默认值来代替 Java 的函数重载

抽象属性

在 Kotlin 中,我们可以声明抽象属性,⼦类对抽象属性重写的时候需要重写对应的 setter/getter
 

委托

  • 属性委托
    • 有些常⻅的属性操作,我们可以通过委托的⽅式,让它只实现⼀次,例如:
    • lazy 延迟属性:值只在第⼀次访问的时候计算
    • observable 可观察属性:属性发⽣改变时的通知
    • map 集合:将属性存在⼀个 map
    • 对于⼀个只读属性(即 val 声明的),委托对象必须提供⼀个名为 getValue() 的函数 对于⼀个可变属性(即 var 声明的),委托对象同时提供 setValue() getValue() 函数,需要被 operator 修饰
  • 类委托
    • 可以通过类委托的模式来减少继承 类委托的,编译器会优先使⽤⾃身重写的函数,⽽不是委托对象的函数

Kotlin 标准函数

使⽤时可以通过简单的规则作出⼀些判断:
  • 返回⾃身 -> 从 applyalso 中选
    • 作⽤域中使⽤ this 作为参数 ----> 选择 apply
    • 作⽤域中使⽤ it 作为参数 ----> 选择 also
  • 不需要返回⾃身 -> 从 runlet 中选择
    • 作⽤域中使⽤ this 作为参数 ----> 选择 run
    • 作⽤域中使⽤ it 作为参数 ----> 选择 let
apply 适合对⼀个对象做附加操作的时候
let 适合配合空判断的时候 (最好是成员变量,⽽不是局部变量,局部变量更适合⽤ if )
with 适合对同⼀个对象进⾏多次操作的时候
 

逻辑运算符

Kotlin运算符
作用
java运算符
and(bits)
按位与
&
or(bits)
按位或
bits.inv()
按位非
~
xor(bits)
按位异或(不同为1,相同为0)
^
shl(bits)
左移运算符
<<
shr(bits)
右移运算符
>>
ushr(bits)
无符号右移运算符
>>>
ushl(bits)
无符号左移运算符
<<<
 
从 Retrofit 的原理来看 HTTPHTTPS
Loading...
shuouyang
shuouyang
android开发 ReactNative开发 小程序开发
最新发布
AOSP 环境搭建
2025-3-29
View 绘制流程-源码解析
2025-3-12
HTTP
2025-3-4
JVM 虚拟机
2025-2-28
蓝牙-BLE-基础
2025-2-28
从 OkHttp 的原理来看 HTTP
2025-2-19
公告
🎉热点信息🎉
--- 1 ---
Jet Brains 推出新的跨平台支持 Kotlin MultiPlatform
--- 2 ---
新的小巧便捷的依赖注入框架 Koin
--- 3 ---
新一代 API 查询语言 GraphQL