在Kotlin中,所有东西都是对象,我们可以在任何变量(如基本类型:数字、字符、布尔、数组与字符串等)上调用成员函数和属性。
一、数字
1. 内置类型种类
类型 | 比特宽度 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
Kotlin提供了如下内置类型来表示数据(和Java很近);
类型 | 比特宽度 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
Java对比:在Kotlin中,字符不是数字;
2. 字面常量的表示
整数字面值有如下几种:
- 十进制:123,Long类型使用大写L标记:123L;
- 十六进制:0x0F;
- 二进制:0b00001011;
注意:不支持八进制;
浮点数常规表示如下:
- 默认double:123.5、123.5e10;
- Float用f或者F标记:123.5f;
使用下划线使数字常量更易阅读;
//如果数字位数,信用号,进制数据分隔易于阅读
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
val hexBytes = 0xFF_EC_DE_5E
val bytes = 0b11010010_01101001_10010100_10010010
3. 可空引用或泛型才数字装箱
Kotlin运行在Java平台,数字是物理存储为JVM的原生类型, 除非需要可空的引用(如Int?)或泛型,才会把数字装箱;
数字装箱不保留同一性,它保留了相等性;
val a: Int = 10000
//a分别装箱为boxedA何anotherBoxedA
val boxedA: Int? = a
val anotherBoxedA: Int? = a
//输出false,boxedA和anotherBoxedA不是一个对象
print(boxedA === anotherBoxedA)
//输出trud,但是两个对象的值相等
print(boxedA == anotherBoxedA)
4. 不支持隐士转换只能显示转换
由于不同的表示方式,较小的类型不是较大类型的子类型。因此较小的类型不能隐士转换成较大类型;
可以显示转换来拓宽数字,每个数字类型都支持如下方法:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
缺乏隐式转换影响并不大,类型会从上下文推断,算术运算会重载做适当转换;
// 字面值是静态检测为Byte类型
val b: Byte = 1
// 错误,b为Byte类型,不能隐士转换层较大的Int类型
val i: Int = b
// 正确,通过toInt显式拓宽为Int;
val i: Int = b.toInt()
// Long + Int 为 Long
val l = 1L + 3
5. 运算定义成类成员
Kotlin支持数字运算标准集,运算被定义成相应的类成员;
对于位运算,没有特殊字符表示,只可用中缀方式调用命名函数。完整位运算列表(只用于Int和Long)如下:
shl(bits):有符号左移,如Java中<<
shr(bits):有符号右移动,如Java中>>
ushr(bits):无符号右移,如Java的>>>
and(bits):位与
or(bits):位或
xor(bits):位异或
inv():位非
val x = (1 shl 2) and 0x000FF000
二、字符
1. 字符的表示
字符使用Char表示,它们不能直接当作数字;
fun check(c: Char) {
//字符不能当做数字;
if (c == 1) {
// ……
}
}
2. 字符的转义
字符字面值用单引号括号起来:'1';
特殊字符使用反斜杠转义,如:\t、\b、\n、\r、'、"、\和$等;
编码字符使用Unicode转义序列语法:'\uFF00';
3. 字符可显示转换
可以显示把字符转换为Int数字;
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9')
throw IllegalArgumentException("Out of range")
// 显式转换为数字
return c.toInt() - '0'.toInt()
}
当需要可空引用时,像数字、字符会被装箱。装箱不会保留同一性;
三 、布尔值
- 布尔值用Boolean类型表示,它有两个值:true和false;
- 若需要可空引用布尔值会被装箱;
- 内置布尔值运算有:||-短路逻辑或、&&-短路逻辑与和!-逻辑非;
三、数组
1. 数组的表示
数组在Kotlin中使用Array类来表示;
2.数组的函数
定义了get和set函数(按照运算符重载约定会转变为[])和size属性,以及一些其它有用成员函数;
class Array<T> private constructor() {
val size: Int
operator fun get(index: Int): T
operator fun set(index: Int, value: T): Unit
operator fun iterator(): Iterator<T>
// ……
}
3. 数组的创建
数组使用库函数arrayOf()来创建数组,并传递元素值给它;
或者使用arrayOfNulls()可以创建指定大小,元素都为空的数组;
用接受数组大小和一个函数参数的工厂函数用作参数,函数返回给定索引的每个元素初始化值;
var array= arrayOf(1, 2, 3)
var nullArray = arrayOfNulls<Int>(5)
//创建一个 Array<String> 初始化为 ["0", "1", "4", "9", "16"]
val asc = Array(5, { i -> (i * *).toString() })
Java对比: Kotlin中数组是不型变的,意味着Kotlin不让我们把Array<String>赋值给Array<Any>,防止可能运行时失败;
4. 原生类型数组
Kotlin有无装箱开销的专门类来表示原生类型数组:ByteArray、ShortArray、IntArray等;
它们和Array没有继承关系,有同样的方法属性集,有相应的工厂方法;
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]
四、字符串
1. 字符串的表示
字符串用String类型表示,是不可变的;
字符串的元素—字符可以使用索引运算符访问:s[i],可以用for循环迭代字符串;
for (c in str) {
println(c)
}
原生字符串使用三个引号(""")分界符号括起来,内部没有转义并且可以包含换行和任何其他字符;
val text = """
//内部不需要使用转义字符\"
for (c in "foo")
print(c)
"""
2. 字符串字面值
Kotlin有两种类型字符串字面值:转义字符串可以有转义字符,原生字符串可以包含换行和任意文本;
val s = "Hello, world!\n"
3. 字符串模板
字符串可以包含模板表达式,即一小段代码,会求值并把结果合并到字符串中;
模板表达式以美元符号($)开头,由一个简单的名字构成;
val i = 10
// 求值结果为 "i = 10"
val s = "i = $i"
或者使用花括号括起来任意表达式;
val s = "abc"
// 求值结果为 "abc.length is 3"
val str = "$s.length is ${s.length}"
原生字符串和转义字符串内部都支持模板,如果你需要在原生字符串中标识字面值$字符(它不支持反斜杠),可用如下语法:
val price = """
${'$'}9.99
"""
1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)
2.加入“Kotlin开发”QQ讨论群,一起学习一起Hi。(甭客气!尽情的扫描或者长按!)
Kotlin开发群
网友评论