Kotlin 与 Java 对比

227 阅读3分钟

数据类型

语言byteshortintlongfloatdoubleString对象顶级父类
KotlinByteShortIntLongFloatDoubleStringAny
Kotlin可空Byte?Short?Int?Long?Float?Double?String?Any?
javabyteshortintlongfloatdoubleString
java 包装类ByteShortIntegerLongFloatDoubleStringObject

变量声明

kotlin

可变属性声明语法:

var 变量名称[:具体类型] =默认值

示例:

var name:String="Var"

不可变量声明语法:

val 变量名称[:具体类型] =默认值

示例:

val name:String="Val"

常量声明语法:

const val 变量名称[:具体类型] = 值

示例:

const val env: String = "test"

**注意:const val 的值需要编译期间就能确定,是编译期常量 ,val 的值可以运行期确定,是运行时常量 **

String拼接

kotlin $语法

const val prefix ="Hello "
var a="$prefix World"

java 一般使用StringBuilder和StringBuffer,不直接使用+

数据类

java实现:

public class User{
private String id;
private Integer age;

public void setId(String id){
    this.id=id;
}
public String getId(){
  return id;
}
public void setAge(Integer age){
    this.age=ge;
}
public String getAge(){
  return age;
}

}

kotlin实现:

data class User(
    var id:String,
    var age:Int
)

for

    // 区间,左闭右闭区间
//    for (i in 1..10) {
//        println(i)
//    }

    // 区间,左闭右闭区间,倒序
//    for (i in 10 downTo  1) {
//        println(i)
//    }

    // 区间,左闭右开区间
//    for (i in 1 until 10) {
//        println(i)
//    }


    // 区间,左闭右闭区间,步长为2
//    for (i in 1..10 step 2) {
//        println(i)
//    }

//    遍历list
//        val list = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8)
//     直接打印value
//    for (i in list) {
//        println(i)
//    }
    // 打印index
//    for (index in list.indices) {
//        println(index)
//    }
    // 通过index打印value
//    for (index in list.indices) {
//        println(list[index])
//    }

//    遍历map
    val map = mutableMapOf("name" to "kotlin", "time" to "2017")

    for (entry in map) {
        println("${entry.key}: ${entry.value}")
    }
   

switch 和when

java

switch (season) {
    case SPRING:
        System.out.println("春天");
        break;
    case SUMMER:
        System.out.println("夏天");
        break;
    case AUTUMN:
        System.out.println("秋天");
        break;
    case WINTER:
        System.out.println("冬天");
        break;
    default:
        System.out.println("未知");
}

kotlin

when (season) {
    Season.SPRING -> {
        println("Spring")
    }

    Season.SUMMER -> {
        println("Summer")
    }

    Season.AUTUMN -> {
        println("autumn")
    }

    Season.WINTER -> {
        println("winter")
    }

// 如果将枚举类中的结果枚举完可以不写else分支
    else -> {
        println("未知")
    }
}

函数/方法

语法:

fun 方法名():返回值{

}

Lambda

java 语法

(a,b,c)->{

}

kotlin语法:

{a,b,c-> //最后一行结果默认返回 }

修饰符

语言修饰符
javapublicprotectedprivatedefault
kotlinpublicprotectedprivateinternal

kotlin 移除了java中的default(包权限),新增internal(模块可见)

Class

默认修饰符

java: 默认是default ,想要变成final类添加 final标识

kotlin: 默认是public final ,想要变成open类,添加open标识

继承和实现(extends/implementation)

语法,需要父类使用open修饰

class 派生类:父类(),父接口{

}

static和component object

kotlin中没有static,使用了伴生对象

package compare

class CompanionObject {
    companion object{
        // 在这个作用域下的方法和变量全部是类级别的,即Java中的 static ,可以通过类名.调用
        const val content="component object value"
    }
}

fun main() {
    println(CompanionObject.content)
}

java 匿名对象和 kotlin 对象表达式

java

public class AnonymousClass {
   Thread thread= new Thread(new Runnable() {
       @Override
       public void run() {

       }
   });
}

kotlin

class ObjectObject {
    val thread=Thread(object : Runnable{
        override fun run() {

        }

    })
}

数组

java

public class ArrayJava {
    public static void main(String[] args) {
        // 一维数组
        int[] nums = {1, 2, 3, 4, 5, 6};
        // 二维数组
        int [][] array ={{1,2,3},{4,5,6},{7,8,9}};

        for (int[] ints : array) {
            for (int value : ints) {
                System.out.print(value+"\t");
            }
            System.out.println();
        }

    }
}

kotlin

fun main() {
    // 一维数组
    val nums = arrayOf(1, 2, 3, 4, 5, 6)
    // 二维数组
    val array = arrayOf(
        arrayOf(1, 2, 3),
        arrayOf(4, 5, 6),
        arrayOf(7, 8, 9)
    )

    for (tmp in array) {
        for (value in tmp) {
            print("$value \t")
        }
        println()
    }
}