这篇文档是码上开学的项目整体规划档案供感兴趣的人查看,不对文章的编写起任何指导或要求作用。
唯一对文章起指导和要求作用的,是每篇《Kotlin 系列详细计划-xx-文章结构要求》。如果你要写文章,请一定看完你要写的那篇文章的结构要求再开写,不然肯定不会被选为发布稿哦。
所以如果你要写文章,不需要参考这篇文档。
[TOC]
-
声明时,与 Java 格式的不同
- 类型和变量名位置互换
- 中间冒号分隔
- var 关键字打头
- 属性 property(相当于 Java 的字段 field)没有默认值,所以必须在声明时初始化
- 使用
lateinit
可以关闭属性的初始化检查
- 使用
- 通过类型推断,可以省略返回类型
- 但是省略返回类型不等于动态类型,Kotlin 依然是静态类型的
- 可以用
List<String> names = new ArrayList<>()
做例子:右边省略了<>
里面的String
,但它依然是一个ArrayList<String>
实例
-
空安全
- 默认是不可空
- 不可空变量不能赋值
null
- 初始化的时候以及后面的再次赋值都不行
- 不可空变量不能赋值
- 类型右边加
?
号可以声明可空变量- 可空变量在调用的时候需要解决「可能为空」的问题
- 可以用
?.
来做「如果就」规则 - 可以用
!!.
来做「肯定不空」断言- 相当于忽略可空提示的、风险自担的强行调用
- 可以用
- 可空变量在调用的时候需要解决「可能为空」的问题
- 默认是不可空
-
getter / setter
- 读写属性的时候,实际上是调用
getX() / setX()
方法 - 可以重写 setter / getter
- 作用一:设置钩子,添加监听代码
- 作用二:修改读写规则
- 通过重写 getter,可以让属性的值变成动态的
- Kotlin 调用 Java 的 setter/getter
- 反过来 Java 调用 Kotlin 的 setter/getter
- 读写属性的时候,实际上是调用
-
var
和val
var
就是 Java 中的变量,而除了var
之外,Kotlin 还增加了一个val
:val
叫做「只读变量」,是 Java 中没有的val
只能在初始化时赋值一次,之后再也不能赋值。比较像 Java 中的final
修饰的变量。- 但
val
可以通过自定义 getter 来让自己的值动态变化,这是跟 Java 的final
的不同。
-
声明时,和 Java 的格式不同
- 返回类型和方法名位置对换
- 中间用冒号分隔
- 参数的格式记得也和 Java 不一样哟
- 参数也有「可空与不可空」
- 没有返回类型时,写返回
Unit
Unit
返回类型可以省略
-
构造函数
- 构造函数的名字是
constructor
new SomeClass()
变为SomeClass()
- 构造函数的名字是
-
基本数据类型
-
int
float
Integer
Float
一众统一变成了Int
Float
一众 -
区别:全都变成了普通的类
-
全都是对象
-
多了一大堆工具方法,如
Int.toFloat()
-
限制:没有自动转型
var height: Float = 2f // ✔️ var width: Float = 1 // ❌ var offset: Int = 1 var offsetX: Float = offset.toFloat() // ✔️ var offsetY: Float = offset // ❌
-
-
Android 工程师的疑问:没了
int
,会不会有什么暂时想不到的麻烦?
-
-
类型的声明
-
extends 和 implements 变成
:
号 -
默认是 public
-
annotation、enum 的声明
annotation class Xxx enum class Xxx
-
internal
-
override
、open
和final
-
接口和 Java7/8 的区别
-
Any
和Object
-
类型的判断和强转
-
class literal:
::class
,.javaClass
,::class.java
-
对于单例、匿名类、静态 property、静态函数、final、常量、数组、集合,Kotlin 的「不 Java」的写法
- Secondary constructor(
constructor()
) - init 代码块
val
- 有什么区别?
companion object
object
- top-level declarations
对比。
object
object
const
- 「compile-time constant」
- Kotlin 的数组
- Kotlin 的集合
- List
- Set
- Map
- 可变集合/不可变集合
- Kotlin 的数组、集合与 Java 的数组、集合的对比
- 全部默认
public
@hide
:internal
- module 内可见
- 什么是 「module」?
- Java 的 default (package visible):没了
private
和 Java 里private
的区别
- 主构造
- 主构造器里声明属性
- 使用
=
连接返回值 - 参数默认值
- 命名参数
- 本地函数(嵌套函数)
- 字符串模版
- raw string
- 操作符:
forEach
,filter
,map
,flatMap
等 - Kotlin 的
Range
和Sequence
if/else
可以有返回值when
:Kotlin 里的 switchfor
循环(要写吗?)try-catch
- 非强制受检(要写吗?)
?:
?.
==
和===
- Kotlin 的
in
和out
- Kotlin 的
*
号 - Kotlin 的
where
- 简单提一下
reified
(文章里可以直接不提)
- 协程是什么,协程用来干嘛的
- 协程怎么用
- suspend
- CoroutineScope
- CoroutineContext 和 Job
- 协程和线程
- 项目中用协程完全替代线程可以吗?
- 项目中完全不用协程只用线程可以吗?
- 协程和 RxJava
- Kotlin 调用 Java 时的空安全
- 在 Java 中调用 Kotlin 的静态函数
- (写吗?没想好)Kotlin 调用 Java 的 setter / getter 以及 Java 调用 Kotlin 的 setter / getter
- 与 Java 互相调用的相关注解
@JvmOverLoads
@JvmStatic
@JvmName
- 其他
- Java 转换成 Kotlin 的工具
- 转换后需要手动修改的地方:早晚都要写纯 Kotlin 代码,但在初始阶段,快速迁移很重要,而快速迁移的关键就是「发现和解决自动转换工具带来的问题」。
- 反编译 Kotlin bytecode 的工具
- 查看 Kotlin "去糖" 后对应的 Java 代码:没事看两眼,方便理解 Kotlin。
从这里开始,后面的全部作为独立技术点,每个一篇,配有视频来发布。
copy()
componentN()
(未用到的参数可以使用 _
表示,待定)
- 声明扩展
- 扩展函数和成员函数调用优先级
- 扩展函数原理
- 防止滥用
内部类引用外部类对象 循环中指定对象 lambda 中引用指定对象
- 内联函数
inline
,(noinline
待定)
- 非局部返回,(
crossinline
待定) - 内联类
- 类委托
- 属性委托
by lazy
- 线程安全
- Kotlin 是如何实现的(待定)
-
标准函数
repeat
takeIf
/takeUnless
TODO
-
作用域函数
- 相同和区别
- 如何选择/使用实际
- 密封类和枚举之间的联系
- KClass
- 属性引用
- 注解使用处目标(指的是
file
,filed
,set/get
等)
安装包体积大小,及优化
编译时间增加,及优化
语法糖滥用,(及 Lint)
kotlinx.android.synthetic
的缺点,(及替代方案)