在java的既有能力上学习kotlin,可快捷理解新语言特性。总体而言kotlin的语言设计思想是悲观谨慎,相对java的就比较乐观开放。
Kotlin类型 | 位宽度 | Java类型 |
---|---|---|
Double | 64 | double |
Float | 32 | float |
Long | 64 | long |
Int | 32 | int |
Short | 16 | short |
Byte | 8 | byte |
Char不是一个数值类型 | 8 | char |
从对比表格看,java和kotlin的基础类型大部分一致,只是char 的属性在kotlin中为非数字类型。所有的类型名称是首字母大写。
java隐式转换
自动类型转换(隐式类型转换)指的是容量小的数据类型可以自动转换为容量大的数据类型。由低字节向高字节的转换 :byte->short-> char –>int->long->float->double。算数运算中的类型自动转换原则:如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型,结果为double类型。
否则,如果其中一个操作数是float类型,另一个将会转换为float类型,结果为float类型。
否则,如果其中一个操作数是long类型,另一个会转换为long类型,结果为long类型。
kotlin转换
最优解是使用类型带的转换函数:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
1、kotlin函数可直接定义在类之外和C++或python;但Java必须定义在类中,即使main函数也必须是类中的static函数。
2、函数定义的格式是:参数定义必须java是类型后面参数名(int a),kotlin是参数名:后面是类型( a:Int),两种语言刚好相反。java函数的返回类型定义在函数名前,kotlin的返回类型是第一在函数参数后面。
3、可变参数,java 是在参数类型后面使用...;而kotlin 是使用关键词vararg。
4、内联函数,在kotlin文件时直接将内联函数内联掉,这样就是把内联函数执行过程放在调用此内联函数的位置,避免了java中多调用方法的操作,减少性能消耗,在函数定义中增加inline关键词。java无此类似能力。
5、高阶函数,即Kotlin将函数当作参数出入其他函数,和C语言的函数指针异曲同工。java 无类似能力。
6、无返回;java必须是在函数定义时添加void;kotli是unit ,可省略。
1、创建对象,java使用new 关键词;kotlin则不使用new关键词。如val obj = Object()。
2、类型判断 java使用instanceof ;而 kotlin使用is 关键词。
3、构造函数java的构造函数是定义类名一致的的函数名,且可实现函数重载。而kotlin是有一个主构造函数和多个次构造函数,主构造函数是跟在类定义行的类名后面加constructor(可省去),主构造的实现是在init{} 的代码块里面。次构造函数是constructor函数名不需要fun关键词,且可以使用this关键字从另一个构造器调用构造器。
4、属性的可变性控制,java使用final 关键修饰的属性不可变;kotlin是在声明是使用val关键词,可变使用var关键词。
5、访问控制,java的关键词有默认,private,protected,public等4个。kotlin的访问关键词 private,protected,public(Kotlin中的默认修饰符),internal(模块内可见)
6、抽象类定义在java和kotlin都是使用abstract关键词。
7、可继承性控制,java的类默认可继承,如需禁止继承使用final修饰类。而kotlin是默认不可继承,需要使用open关键词修饰类才可继承。
8、多继承问题,java不支持一次继承多个类;kotlin不支持一次继承多个类。
9、继承关键词,java extends;kotlin是冒号:。
10、内部类, java的内部类定义是在上层类里定义新类;kotlin内部类使用 inner 关键字来表示。 内部类会带有一个对外部类的对象的引用,所以内部类可以访问外部类成员属性和成员函数。
11、嵌套类:java只有内部类,kotlin的嵌套类没有像内部类的inner关键词定义,和java的静态内部类相似。
12、泛型:使用java和kotlin一致,使用
13、扩展函数;java无此能力;kotlin
14、重载:java的重载是多个同名函数;kotlin是使用@JvmOverloads注解
15、类的超级基类:java是Object,kotlin是Any。
16、静态属性或方法:java使用static 关键字修饰;kotlin没有static,使用以下4种方法:
companion object - 伴随对象,声明单例的方式
@JvmField + @JvmStatic 注解 - 使用注解标签声明 static 的部分
object 单例 - 静态单例其实和 companion object 类似
const - 包内唯一性,脱离类的束缚,kotlin 的特性,在 java 中会编译生成一个 kotlin.kt 的文件专门对齐提供支持
1、kotlin在对象后面加!! 和java一致,出现空会爆空指针异常。
2、kotlin的类型后面加?表示可为空。
3、kotlin对象后面加?表示返回null:如当person为空时 var age = person?.getAge(),得到到age可为null。
4、kotlin配合?: 进行空判断如 age?.toInt() ?: -1当age为空时返回-1.
1、定义接口java和kotlin都是使用interface关键词。
2、java 中类实现多个不同接口的同名同类型函数,默认都实现;kotlin处理多个接口的同名函数super<具体接口>.同名函数()。
1、大部分kotlin容器之前使用java的容器,小部分也是kotlin包装一层而已。
Kotlin 封装的容器
两种语言的逻辑控制语句大部分一致。但时java的switch case 在kotlin中是when的语句替换,而且在when语句中使用in可表示的情况是一个范围内,不仅仅是一个确定单位值,这一点比switch要有优势。
1、协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协程。
1、kotlin可使用关键词infix 进行操作符定义,java无此能力。
1、锁:java使用synchronized;kotlin使用@Synchronized注解
2、可见性:java使用volatile;kotlin使用@Volatile
3、 kotlin值直接使用java得JUC功能包
1、java的NDK 的函数定义是使用native关键词;kotlin使用external修饰函数。
2、so库加载时机,java可静态代码块中static{};kotlin则是在主构造函数块init{}。
3、使用Kotlin实现NDK 必须在模块的gradle中添加:kotlin-android 是必须配置的 ,kotlin-android-extensions 是扩展 , 选择性配置 , 配置了之后 , 可以很方便地使用视图绑定 ;kotlin-kapt 也是选择性配置 , 配置使用注解 。
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-android-extensions'
id 'kotlin-kapt'
}
4、在项目的gradle必须添加
buildscript {
ext.kotlin_version = "1.4.10"
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
1、新增空安全
2、灵活,when语句更灵活,也可以灵活自定义操作符。
3、语言设计更为谨慎
4、函数可脱离类存在,而且扩展了函数为参数使用,增加灵活性
5、可兼容java,使用java库,可使得java开发平稳过渡
6、相对java的代码编写量小