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
修饰的 ( abstract
和 override
例外)相等性
==
结构相等(调用equals()
比较)
===
引用(地址值)相等
operator
通过
operator
修饰「特定函数名」的函数,例如 plus
、 get
,可以达到重载运算符的效果infix 函数
必须是成员函数或扩展函数
必须只能接受⼀个参数,并且不能有默认值
注解使⽤处⽬标
当某个元素可能会包含多种内容(例如构造属性,成员属性),使⽤注解时可以通过「注解使⽤处⽬标」,让注解对⽬标发⽣作⽤,例如
@file:
、 @get:
、 @set:
等。扩展
- 扩展函数可以为任何类添加上⼀个函数,从⽽代替⼯具类
- 扩展函数和成员函数相同时,成员函数优先被调⽤
- 扩展函数是静态解析的,在编译时就确定了调⽤函数(没有多态)
内联函数
- 内联函数配合「函数类型」,可以减少「函数类型」⽣成的对象
- 使⽤
inline
关键字声明的函数是「内联函数」,在「编译时」会将「内联函数」中的函数体直接插⼊到调⽤处。所以在写内联函数的时候需要注意,尽量将内联函数中的代码⾏数减少!
- 部分禁⽤⽤内联
noinline
可以禁⽌部分参数参与内联编译
具体化的类型参数
因为内联函数的存在,我们可以通过配合
inline
+ reified
达到「真泛型」的效果函数参数默认值
可以通过函数参数默认值来代替 Java 的函数重载
抽象属性
在 Kotlin 中,我们可以声明抽象属性,⼦类对抽象属性重写的时候需要重写对应的 setter/getter
委托
- 属性委托
lazy
延迟属性:值只在第⼀次访问的时候计算observable
可观察属性:属性发⽣改变时的通知map
集合:将属性存在⼀个map
中
有些常⻅的属性操作,我们可以通过委托的⽅式,让它只实现⼀次,例如:
对于⼀个只读属性(即 val 声明的),委托对象必须提供⼀个名为
getValue()
的函数
对于⼀个可变属性(即 var 声明的),委托对象同时提供 setValue()
、getValue()
函数,需要被 operator 修饰- 类委托
可以通过类委托的模式来减少继承
类委托的,编译器会优先使⽤⾃身重写的函数,⽽不是委托对象的函数
Kotlin 标准函数
使⽤时可以通过简单的规则作出⼀些判断:
- 返回⾃身 -> 从
apply
和also
中选 - 作⽤域中使⽤
this
作为参数 ----> 选择apply
- 作⽤域中使⽤
it
作为参数 ----> 选择also
- 不需要返回⾃身 -> 从
run
和let
中选择 - 作⽤域中使⽤
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) | 无符号左移运算符 | <<< |
- 作者:shuouyang
- 链接:https://notion-tree.vercel.app/article/39fdda27-7067-4b5a-a8fa-b3c1e5d2d7e8
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章