Java和kotlin的对比

0、序言

    在java的既有能力上学习kotlin,可快捷理解新语言特性。总体而言kotlin的语言设计思想是悲观谨慎,相对java的就比较乐观开放。

1、数据类型

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

2、函数

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 ,可省略。

3、语句结束java是分号结束,kotlin去除类分号结束标识。

4、类和对象

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一致,使用<T>。

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 的文件专门对齐提供支持

5、空安全

1、kotlin在对象后面加!! 和java一致,出现空会爆空指针异常。

2、kotlin的类型后面加?表示可为空。

3、kotlin对象后面加?表示返回null:如当person为空时 var age = person?.getAge(),得到到age可为null。

4、kotlin配合?: 进行空判断如  age?.toInt() ?: -1当age为空时返回-1.

6、接口

1、定义接口java和kotlin都是使用interface关键词。

2、java 中类实现多个不同接口的同名同类型函数,默认都实现;kotlin处理多个接口的同名函数super<具体接口>.同名函数()。

7、容器

   1、大部分kotlin容器之前使用java的容器,小部分也是kotlin包装一层而已。

   Kotlin 封装的容器

8、逻辑语句

 两种语言的逻辑控制语句大部分一致。但时java的switch case 在kotlin中是when的语句替换,而且在when语句中使用in可表示的情况是一个范围内,不仅仅是一个确定单位值,这一点比switch要有优势。

9、协程

1、协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协程。

10、定义操作符

1、kotlin可使用关键词infix 进行操作符定义,java无此能力。

11、线程

1、锁:java使用synchronized;kotlin使用@Synchronized注解

2、可见性:java使用volatile;kotlin使用@Volatile

3、 kotlin值直接使用java得JUC功能包

12、NDK

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"
    }
}

13、kotlin的优点

1、新增空安全

2、灵活,when语句更灵活,也可以灵活自定义操作符。

3、语言设计更为谨慎

4、函数可脱离类存在,而且扩展了函数为参数使用,增加灵活性

5、可兼容java,使用java库,可使得java开发平稳过渡

6、相对java的代码编写量小

猜你喜欢

转载自blog.csdn.net/hqiangtai/article/details/128847457