# kotlin 数据类型
从这篇文章开始,我们将深入学习 Kotlin 常见的几大基本数据类型,比如整数类型、浮点数类型、字符类型、布尔类型等。因为这些是我们入手一门新的语言时的第一步,也是基础中的基础。
Tips
为了让大家快速掌握本节课的内容,我会将 Kotlin 和 Java 类比着进行讲解,这也是作为一个老开发快速学习其它语言的一个屡试不爽的经验所在。 就像习武一样,习武的人往往会借助已有的内功,可以很快速的掌握一门新的武功,那么对于从事 Android 的小伙伴们来说,这么多年对 Java 的使用就是我们的内功 ,所以在这里我会带着大家借助已有的内功来快速上手 Kotlin。
# 目录
- 基本数值类型
- 浮点类型
- 字符类型
- 字符串类型
- 类型强制转换
- 数字运算
# Kotlin 基本数值类型
基本数据类型包括 Byte、Short、Int、Long、Float、Double
# 整数类型
类型 | 位宽 | 最小值 | 最大值 |
---|---|---|---|
Byte | 8 | -128 | 127 |
Short | 16 | -32768 | 32767 |
Int | 32 | -2,147,483,648 (-2^31) | 2,147,483,647 (2^31 - 1) |
Long | 64 | -9,223,372,036,854,775,808 (-2^63) | 9,223,372,036,854,775,807 (2^63 - 1) |
val number = 100 // 默认是 Int 类型 | |
val bigNumber = 8000000000 // 超过 Int 最大值默认是 Long 类型 | |
val longNumber = 20L // 数字后面显式加 L,表示声明 Long 类型 | |
val byteNumber:Byte = 1 |
Tips
所有未超出Int
最大值的整型值初始化的变量都默认为Int
类型,如果初始值超过了其最大值,那么推断为Long
类型。在数字值后面显式添加L
表示一个Long
类型
# Float、Double 浮点类型
Kotlin 中提供了 Float
和 Double
两种类型来分别表示单精度和双精度的浮点数类型。
类型 | 位宽 |
---|---|
Float | 32 |
Double | 64 |
val doubleNumber = 3.1415928888 // 默认是 Double 类型 | |
val floatNumber = 3.1415928888f // 尾部加 f 或 F 显式表示这是一个 Float 类型的浮点数 |
Tips
Kotlin 对于小数的默认推断是Double
类型。如果需要显式将一个小数指定为Float
类型需要在数值尾部加入f
或F
。由于Float
类型十进制位数是6位
,所以上述例子中floatNumber
实际值大小为3.1415926
,后面就会出现进度丢失舍弃。
在 Kotlin 中还有一点与 Java 不同的是,Kotlin 中数字不存在隐式的拓宽转换。比如一个函数参数为 Double
的函数只能接收 Double
类型,不能接收 Float
、 Int
或者其他数字类型
# 字符类型
在 Kotlin 中字符用 Char
类型表示
fun testChar(char: Char) { | |
if(char == 4) {...}// 此处会提示类型不匹配的异常 | |
} |
字符的值需要用单引号括起来: '0'
、 '9'
。
fun decimalDigitValue(c: Char): Int { | |
if (c !in '0'..'9') | |
throw IllegalArgumentException("Out of range") | |
return c.toInt() - '0'.toInt() // 显式转换为数字 | |
} |
# 布尔类型
在 Kotlin 使用 Boolean
表示布尔类型,它只有两个值 true
和 false
。注意可空类型 Boolean?
类型会存在装箱操作。
val isVisible: Boolean = false | |
val isVisible = false // 自动推断为布尔 Boolean 类型 |
# 字符串类型
在 Kotlin 中字符串用 String
类型表示。字符串是不可变的。 字符串的元素 —— 字符可以使用索引运算符访问: s[i]
。 可以用 for 循环迭代字符串:
val str="1234567890" | |
for(char in str) { | |
println(char) | |
} |
# 字符串模板
字符串字面值可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符( $
)开头,由一个简单的名字构成:
val number = 100 | |
println("The Result is $number") |
或者用花括号 ${}
括起来的任意表达式:
val text = "This is Text" | |
println("Text length is ${text.length}") |
字符串与转义字符串内部都支持模板。 如果你需要在原始字符串中表示字面值 $
字符(它不支持反斜杠转义),你可以用下列语法:
val price = "${'$'}9.99" |
和 Java 一样,Kotlin 可以用 +
操作符连接字符串。这也适用于连接字符串与其他类型的值。
val age = 28 | |
println("I am " + age + "years old!") | |
println("I am $age years old!") |
# 字符串的值
Kotlin 有两种类型的字符串字面值:转义字符串可以有转义字符, 以及原始字符串可以包含换行以及任意文本。以下是转义字符串的一个示例:
val s = "Hello, world!\n" // \n 换行 | |
val s2= "{\"key\":\"value\"}" // \ 反斜杠对 "" 进行转义,保留字符串格式 |
字符串使用三个引号( """
)分界符括起来,内部没有转义并且可以包含换行以及任何其他字符:
val text = """ | |
for (c in "foo") | |
print(c) | |
""" |
还可以通过 trimMargin()
函数去除前导空格:
val text = """ | |
|Tell me and I forget. | |
|Teach me and I remember. | |
|{"key1": "value1"} | |
|{"key2": "value2"} | |
""".trimMargin() |
# 类型强制转换
在 Kotlin 中与 Java 不同是通过调用 toInt、toDouble、toFloat
之类函数来实现数字类型的强制转换的。
类型 | 强转函数 |
---|---|
Byte | toByte() |
Short | toShort() |
Int | toInt() |
Long | toLong() |
Float | toFloat() |
Double | toDouble() |
Char | toChar() |
val number =100 // 声明一个整形 number 对象 | |
number.toString() | |
number.toByte() | |
number.toShort() | |
number.toLong() | |
number.toFloat() | |
number.toDouble() | |
.... |
# 数字运算
# 四则运算
除法 /
:
val number = 3 / 2 | |
println(number) // 输出 1 | |
val floatNumber = 3 / 2.toDouble() | |
println(number) // 输出 1.5 |
乘法 *
:
val number = 3 * 2 | |
println(number) // 输出 6 |
加法 +
:
val number = 3 + 2 | |
println(number) // 输出 5 |
减法 -
:
val number = 3 - 2 | |
println(number) // 输出 1 |
取余 %
:
val number = 3 % 2 | |
println(number) // 输出 1 |
# 位运算
Kotlin 中的位运算和 Java 不同的是没有用特殊符号来表示,可以采用了中缀函数方式调用具名函数。
shl(bits)
– 有符号左移【shl 是 Shift Logical Left 的缩写】shr(bits)
– 有符号右移ushr(bits)
– 无符号右移and(bits)
– 位与or(bits)
– 位或inv()
– 位非xor(bits)
– 位异或
val vip= true | |
val admin= false | |
val result = vip and(admin) =false | |
val result = 8 ushr(2) = 2 |
# AS4.0 及以上版本 kotlin 项目无法运行 java-main 方法解决方案
<option name="delegatedBuild" value="false" />