本文是学习Kotlin的基本类型,Kotlin的基本类型与Java有一些不同,例如整数类型,Java是int
表示,而Kotlin是Int
表示;例如布尔类型,Java是boolean
表示,而Kotlin是用Boolean
表示。
在 Kotlin 中,所有变量的成员方法和属性都是一个对象,我们可以在任何变量上调用成员函数和属性。
在本文中,将会讲解经常被使用的类型:Numbers
,Characters
,Booleans
,Arrays
,Strings
。
Numbers(数值)
Kotlin处理数值的方式与Java类似,单又不完全相同,例如,数值没有隐式扩展转换,在默写情况下文字也略有不同。
Kotlin 提供了如下内建数值类型(与Java类似)
Type | Bit width(字宽) |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
注意:字符不是kotlin中的数值类型
字面常量(Literal Constants)
对于整数值,有以下几种常量
- 整型:
123
- 长整型要加
L
:123L
- 长整型要加
- 16进制:
0x0F
- 二进制:
0b00001011
对于浮点数值
- Doubles类型:
123.5
,123.5e10
- Floats类型要加
f
orF
:123.5f
注意:不支持8进制
数值中的下划线(1.1版开始)
Java8支持数值使用下划线类分割数字分组,可以使用下划线使数字常量更易读:
val oneMillion = 1_000_000
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
等同于
1000000
ffecde5e
11010010011010011001010010010010
表示法(Representation)
在Java平台上,数值被 JVM 虚拟机以字节码的方式物理存储的,除非我们需要做可空标识(比如说 Int?) 或者涉及泛型。
val a: Int = 10000
print(a === a) // 打印'true' ,与Java的‘===’一样
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA === anotherBoxedA) // 打印`false`
另一方面,值是相等的
val a: Int = 10000
print(a == a) // 打印 'true'
val boxedA: Int? = a
val anotherBoxedA: Int? = a
print(boxedA == anotherBoxedA) // 打印 'true'
显式转换(Explicit Conversions)
由于不同的表示,短类型不是长类型的子类型
//这是些伪代码,不能编译的
val a: Int? =1 // Int (java.lang.Integer)
val b: Long? = a // Long (java.lang.Long)
print( a == b ) // 打印 'false' ,由于 Long 类型的 equals() 只有和 Long 比较才会相同
短类型是不会隐式(自动)转换为长类型的,需要显示(手动)转换才行
val b: Byte = 1 //
val i: Int = b // 错误,不能自动转换
改为显示(手动)转换
val i: Int = b.toInt() // 成功
数值类型支持的转换有下面几种
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
Kotlin会自动转换类型的,比如
val l = 1.toLong + 1 // Long + Int => Long,自动转换成Long类型
运算符(Operations)
Kotlin支持标准的算术运算表达式,这些运算符被声明为相应类的成员。
对于位操作,没有特殊的字符,只是命名的函数可以以中缀形式调用,例如
val x = (1 shl 2) and 0x000FF000
支持的位运算操作符有(仅适用于Int
和Long
类型)
-
shl(bits)
– 带符号左移 (相当于 Java的<<
) -
shr(bits)
– 带符号右移 (相当于 Java的>>
) -
ushr(bits)
– 无符号右移 (相当于 Java的>>>
) -
and(bits)
– 按位与 -
or(bits)
– 按位或 -
xor(bits)
– 按位异或 -
inv()
– 按位翻转
Characters(字符)
字符类型用 Char 表示,不能直接当做数值来使用
fun check(c: Char) {
if (c == 1) { // 错误:类型不匹配
// ...
}
}
字符文字用单引号括起来:'1',可以使用反斜杠转义特殊字符,支持以下转义序列:\ t,\ b,\ n,\ r,',\“,\和\ $。
要编码任何其他字符,使用Unicode转义序列语法:'\ uFF00'。
下面是将字符类型显示(手动)转换成Int类型
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9')
throw IllegalArgumentException("Out of range")
return c.toInt() - '0'.toInt() // 显示转换为数值类型
}
Boleans(布尔值)
Kotlin的Boolean
同Java的boolean
类型一样,只有true
和false
Boolean
的操作同Java一样
-
||
– 或者 -
&&
– 并且 -
!
- 非
Arrays(数组)
Kotlin中的数组由Array表示,通过[]
调用get
和set
方法,支持size
属性,以及其他,下面是Array
代码
class Array<T> private constructor() {
val size: Int
fun get(index: Int): T
fun set(index: Int, value: T): Unit
fun iterator(): Iterator<T>
// ...
}
可以使用 arrayOf()
创建Array,arrayOf(1, 2, 3)
创建了一个[1, 2, 3]
的数组。
可以使用 arrayOfNulls()
创建一个指定大小的空Array。
另外也可以使用工厂函数,该函数采用数组大小和函数,该函数可以返回每个数组元素的索引的初始值
// 创建 Array<String> 内容为 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * i).toString() })
注意:和 java 不一样,arrays 在 kotlin 中是不可变的。这意味这 kotlin 不允许我们把 Array<String>转为 Array<Any>,这样就阻止了可能的运行时错误(但可以用 Array<outAny>)
Kotlin 有专门的类来表示原始类型: ByteArray, ShortArray, IntArray 等等。这些类与Array类没有继承关系,但它们具有相同的方法和属性集。也有相应的工厂功能
val x: IntArray = intArrayOf(1, 2, 3) // 创建一个Int类型的Array
x[0] = x[1] + x[2]
Strings(字符串)
字符串由类型String
表示,字符串是不可变的。字符串的元素是可以通过索引操作访问的字符:s [i]
。一个字符串可以用一个for循环迭代
for (c in str) {
println(c)
}
字符串字面量(String Literals)
Kotlin 有两种类型的 String
:一种是可以带分割符的,一种是可以包含新行以及任意文本的。
带分割符的 String
与Java 的 String
类似
val s = "Hello World!\n"
如果String 是由三个引号包裹的("""),不可以包含分割符但可以包含其它字符:
val text = """
for (c in "foo")
print(c)
"""
可以使用trimMargin()
来删除空格
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
默认为|
用作边距前缀,可以选择另一个字符并将其作为参数传递,如trimMargin(“>”)
。
字符串模版(String Templates)
字符串可以包含模板表达式,前面介绍了可以使用'${}'模版表达式
val s = "abc"
val str = "$s.length is ${s.length}" //识别为 "abc.length is 3"
还有一种是可以使用$
模版表达式
val i = 10
val s = "i = $i" // 识别为 "i = 10"
模版表达式同样可以用于由三个引号包裹的String,如下面的,${"$"}
表示$符号
val price = """
${'$'}9.99
"""