Kotlin For Android介绍
发展
Kotlin
完全兼容JDK6,AndroidStudio3.0及IntelliJ等IDE工具提供集成开发环境支持。
Kotlin
可用于多个平台(JVM/Android、JavaScript)。Kotlin
标准库提供了所有平台可用的核心API,不同平台相关的扩展(例如JVM的java.io
),以及可统一调用但工作方式不同的API(例如JVM和JavaScript的正则表达式)。
Kotlin语法
概念
Kotlin
中,任何东西都对象,包括成员方法/属性等。所有类继承Any
,Any
不同于Java.lang.Object
的一点是,除了hashCode()
,toString()
,equals()
方法,Any
没有其他成员。
对象
Byte
(1: 字节)/Short
(2)/Int
(4)/Float
(4)/Long
(8)/Double
(8)
=== 需要两个对象的值和引用地址完全相同
== 只需要两个对象的值相同
NaN
: Not a Number
val
(value, immutable),var
(varibale, mutable)
空安全
避免空指针的黄金准则是,对于可为空的变量,编译器会强制开发者在使用前进行处理。
相近函数对比
let,apply,with,run函数对比 参考
属性
四种可见性:private,protected,internal,public. 默认public.
属性可以引用特定对象的实例方法
主构造函数跟随在类的声明后,不能包含任何代码。可使用init
方法进行初始化。次构造函数使用constructor声明。没有new
关键词
所有类和方法都是final,除非使用open
声明。
子类可以用var属性覆盖父类的一个val属性,但不能用val覆盖var。
同伴对象和ObJect都可用作static访问。同伴类与类一起使用,一个类中只能有一个同伴对象。
Interface及Abstract
Kotlin中的Interface可以实现方法,子类可选择继承此方法。interface的属性不能拥有隐藏属性backing field,不能对属性进行初始化,而抽象类中的属性可以,抽象类可以使用非public修饰符和final成员。总之,虽然kotlin中的Interface更强大了,但是接口出发点是为了定义一个通用的协作方式,而抽象类是定义一个不完整的抽象父类。
泛型的替代方案
out
实现了泛型的协变,生产者
in
实现了泛型的逆变,消费者
数组对象是不型变的。
reified
是具体化,作为kotlin的一个方法泛型关键字,它代表你可以在方法体内访问泛型指定的JVM对象。必须以inline内联方式声明这个方法才有效。参考
Flow控制流
if是一个符号,可返回一个值。
when可做符号也可以做语法。
Exceptions
Kotlin中所有exceptions继承Throwable,携带message属性并且不需要检查。
Android使用
Anko
库提供了UI构造及线程等实用的扩展函数。建议等一两年后,第三方Kotlin库及Android Studio支持性更趋丰富后再转用Kotlin开发。
Kotlin
可完美兼容Android的Unit Test
及Instrumentation Test
与Java的区别
详细区别
- 区别于泛型及通配符的out/in关键词
<? extends>实现了泛型的协变
<? super>实现了泛型的逆变 - 高级的函数编程支持
不仅支持Java引入的lambda及Stream库,还支持函数类型及函数引用。 - 对集合/空安全/POJO的语法糖
提供全局的空安全的编译检查,避免出现空指针异常。
可通过data/object/companion object提供POJO对象的不同需求。 - 其他功能
@操作符提供了GOTO语法跳转功能的支持,在循环/嵌套引用中能方便获取目前对象及目前位置。kotlin能更快捷的定义POJO,单例,观察者,懒加载,委托。对于目前流行的对象编程提供语法糖。
Kotlin特有
- Lambda 表达式 + 内联函数 = 高性能自定义控制结构
- 扩展函数
- 空安全
- 智能类型转换
- 字符串模板
- 属性
- 主构造函数
- 一等公民的委托
- 变量和属性类型的类型推断
- 单例
- 声明处型变 & 类型投影
- 区间表达式
- 操作符重载
- 伴生对象
- 数据类
- 分离用于只读和可变集合的接口
- 协程
Java特有
Java对-128到127的Integer对象进行缓存,当创建符合此范围的Integer对象时会复用。
字符串常量池存放的是对象引用,而不是对象。
Java中,对象都创建在堆内存中。
Java中,泛型是不型变的
感想
一开始觉得官方推荐Kotlin要耗费时间去学,后来就开始喜欢上这颗语法糖。
突然觉得Java太原始了。kotlin的使用对初学者和老鸟都十分友好。语法的使用不再是程序员的入门门槛,却也是进阶的门槛。对空安全的支持非常到位。