编程语言中使用类型的目的是 让编译器能够确定类型所关联的对象需要分配多少空间。
使用类型系统,编译器可以检查无意义的、无效的、类型不匹配等错误代码。
Java与Kotlin类型系统
基本数据类型
和 引用数据类型
在创建时,内存存储方式的区别:
基本数据类型
在被创建时,在栈上给其分配一块内存,将其值直接存储在栈上,性能高;引用数据类型
在被创建时,现在的栈上给其引用分配一块内存(句柄),对象的具体信息存储在堆内存
上,然后由栈上面的引用指向堆内存中对象的地址。
Java为每一个基本类型都引入了对应的包装类型,从Java5开始引入了自动装箱/拆箱机制,使得二者可以互相转换。
- 原始类型:boolean,char,byte,short,int,long,float,double.
- 对应的包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double.
Kotlin中去掉了原始类型,只有包装类型,编译器在编译代码的时候,会自动把对应的包装类型拆箱为原始类型,优化性能。
Kotlin类型系统分为可空类型
和不可空类型
。
Kotlin中数字类型 与 Java中原始数字类型:
Kotlin | Java |
---|---|
Int | int |
Long | long |
Float | float |
Double | double |
Kotlin中可空数字类型 与 Java中装箱数字类型:
Kotlin | Java |
---|---|
Int? | Integer |
Long? | Long |
Float? | Float |
Double? | Double |
fun testTypeF(): Unit {
val a:Int = 100
val b:Int = 100
println(a === b) // 引用相等 , 输出:true
println(a==b) // 值相等,输出:true
val x:Int? = 1000
val y:Int? = 1000
// 可空类型Int?等价于Java中的Integer包装类型,这里的x、y指向不同对象,因此引用不相等
println(x === y) // 引用不相等 , 输出:false .
println(x==y) // 值相等,输出:true
}
-
Java中,从基本数字类型到引用数字类型的转换过程就是
装箱操作
,如 int 转为 Integer;
反过来,从 Integer 转为 int 就是拆箱操作
。 -
Kotlin中,非空数字类型 转为 可空数字类型 的过程就是
装箱操作
,如 Int 转为 Int? 。
同时非空的Int类型 会被编译器自动拆箱成 基本数字类型int,保存到栈空间。
数组 Array
Java中的数组类型 T[]
,方括号不太“优雅”。
Kotlin摒弃了这个数组类型声明的语法。
Kotlin直接使用 Array
类型代表数组类型。
fun testArray(): Unit {
// 构造5个元素的数组,元素初始值是 i * i
val sq = Array(5) { i -> i * i }
sq.forEach{ println(it)} // 输出:0,1,4,9,16
}