Kotlin中有以下几种常见的基本数据类型:数字、字符、布尔值、数组与字符串。
开始了解这些基本类型之前,我们首先的看一下在kotlin中是怎么申明一个变量的,有学习过js的朋友,可能看到kotlin中申明变量的方式会比较熟悉。
1.只读变量
声明一个只读变量需要使用关键字val:
val helloString = "Welcome to Kotlin!"
println(helloString)
此时运行程序,会输出:Welcome to Kotlin!。如果我们试着修改helloString的值:
helloString = "Thanks"
我们会看到如下错误信息:
Error:(5, 5) Kotlin: Val cannot be reassigned
也就是说Val类型的变量是不能被再次修改的。
2.可变变量
声明一个可变变量需使用关键字var:
var studentNumber = 2
studentNumber += 2
此时studentNumber 和我们常见的变量一样我们可以自由的去操作这个变量。
看到这里可能细心的朋友会发现在声明变量的时候,我并没有显示的指定变量的类型,而是交给kotlin自己去推断变量的类型。在一般情况下,我们是不需要显示指定类型的,但是如果在声明一个变量时没有赋值,那么我们就要显示指定这个变量的类型。
var intVar: Int
其基本语法是变量名加一个冒号 后面跟上变量类型。
如果没有指定类型,那么kotlin会提示如下错误:
Error:(12, 9) Kotlin: This variable must either have a type annotation or be initialized
意思就是变量必须被初始化或者指定类型。
数字
在kotlin中,数字可以使用以下内置类型来表示:
Double 64
Float 32
Long 64
Int 32
Short 16
Byte 8
然后我们可以通过代码来看一下这些类型的能够表示的最大值和最小值:
/*查看数字内置类型的最大和最小表示范围*/
println("Int min:" + Int.MIN_VALUE)
println("Int max:" + Int.MAX_VALUE)
println("Long min:" + Long.MIN_VALUE)
println("Long max:" + Long.MAX_VALUE)
println("Float min:" + Float.MIN_VALUE)
println("Float max:" + Float.MAX_VALUE)
println("Double min:" + Double.MIN_VALUE)
println("Double max:" + Double.MAX_VALUE)
println("Short min:" + Short.MIN_VALUE)
println("Short max:" + Short.MAX_VALUE)
println("Byte min:" + Byte.MIN_VALUE)
println("Byte max:" + Byte.MAX_VALUE)
MIN_VALUE和MAX_VALUE都是kotlin内置的常量,它的声明形式如下:
public const val MIN_VALUE: Byte = -128
输出结果:
Int min:-2147483648
Int max:2147483647
Long min:-9223372036854775808
Long max:9223372036854775807
Float min:1.4E-45
Float max:3.4028235E38
Double min:4.9E-324
Double max:1.7976931348623157E308
Short min:-32768
Short max:32767
Byte min:-128
Byte max:127
数字的字面常量表示和我们以前见到的大同小异:
十进制: 123
Long 类型用大写 L 标记: 123L
十六进制: 0x0F
二进制: 0b00001011
注意: 不支持八进制
Kotlin 同样支持浮点数的常规表示方法:
默认 double:123.5、123.5e10
Float 用 f 或者 F 标记: 123.5f
从kotlin1.1开始我们可以在数字中使用下划线使我们的程序更加容易阅读:
val oneMillion = 1_000_000
val creditCardNumber = 1234_5678_9012_3456L
显式转换
在kotlin中较小的类型不能隐式的转化为较大类型,这一点和java还是有区别的,这也就意味着如果我们将一个较小的类型赋值给一个较大类型会导致错误的产生:
var intVar2Long = 15
var longVars: Long = intVar2Long
此时我们编译程序会发现下面的错误:
Error:(35, 26) Kotlin: Type mismatch: inferred type is Int but Long was expected
当然了,kotlin的每个数字类型都有以下的方法可供我们使用来显示的进行类型转化:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
示例:
/*显示转化*/
var intVars = 1500
println(intVars.toByte())
println(intVars.toShort())
println(intVars.toInt())
println(intVars.toLong())
println(intVars.toFloat())
println(intVars.toDouble())
println(intVars.toChar())
这里我们将一个int变量进行转化:
-36
1500
1500
1500
1500.0
1500.0
ל
上面的结果大家也看到了,从较大的数据类型转为较小的数据类型会导致数据的缺失,这一点大家都明白,实际中也没有人会这么玩的。
在kotlin中对于位运算稍微需要我们去记忆的,它并没有特殊的操作符共我;们使用,只能通过关键字的形式:
shl(bits) – 有符号左移 (Java 的 <<)
shr(bits) – 有符号右移 (Java 的 >>)
ushr(bits) – 无符号右移 (Java 的 >>>)
and(bits) – 位与
or(bits) – 位或
xor(bits) – 位异或
inv() – 位非
字符
字符用 Char 类型表示。它们不能直接当作数字,但是我们可以显式把字符转换为 Int 数字。
字符字面值用单引号括起来: ‘1’。 特殊字符可以用反斜杠转义。 支持这几个转义序列:\t、 \b、\n、\r、’、"、\ 与 $。 编码其他字符要用 Unicode 转义序列语法:’\uFF00’。
var charVar = 'd'
布尔
布尔用 Boolean 类型表示,它有两个值:true 与 false。
内置的布尔运算有:
|| – 短路逻辑或
&& – 短路逻辑与
! - 逻辑非
数组
kotlin中使用Array类来表示数组,在创建数组的时候我们需要特别留意一下它的语法:
首先,我们可以通过Array的构造方法来创建一个数组,其使用语法如下:
/**
* Creates a new array with the specified [size], where each element is calculated by calling the specified
* [init] function. The [init] function returns an array element given its index.
*/
public inline constructor(size: Int, init: (Int) -> T)
其中size表示我们要创建的数组大小,init返回元素索引,至于 -> 后面则是我们期望的初始值:
var array: Array<Int> = Array(5) { i -> 0 }
array.forEach { println(it) }
上面的示例我们定义了一个大小为5,初始值都为0的一个数组,其中大家可以看到{ i -> 0 }放在了后面,并没有放在圆括号里面,这是新版的kotlin给出的推荐写法,写在里面也是可以正常运行的。
另外我们查看kotlin中Array的类文件可以发现:
/**
* Represents an array (specifically, a Java array when targeting the JVM platform).
* Array instances can be created using the [arrayOf], [arrayOfNulls] and [emptyArray]
* standard library functions.
* See [Kotlin language documentation](http://kotlinlang.org/docs/reference/basic-types.html#arrays)
* for more information on arrays.
*/
其中kotlin也给我们提供了三个函数arrayOf, arrayOfNulls]and emptyArray来创建一个数组,下面我们通过示例来看下它们怎么使用:
var intArray = arrayOf(1,2,3)
var stringArray = arrayOfNulls<String>(5) 可以用于创建一个指定大小的、所有元素都为空的数组
var booleanArray = emptyArray<Boolean>() //创建一个空数组
上面这张图可能看起来更加清晰一些。
Kotlin 也有专门的类来表示原生类型数组: ByteArray、 ShortArray、IntArray 等等。这些类与 Array 并没有继承关系,但是它们有同样的方法属性集。它们也都有相应的工厂方法:
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]
字符串
kotlin中使用String类来表示字符串,字符串的元素可以通过索引运算符[i]的方式来进行访问:
var str = "Hello Kotlin!"
println(str[0])
另外常见的就是字符串的拼接了,这个我们可以使用熟知的+号操作符来进行字符串的拼接,当然了前提是第一个元素必须是字符串了。
var str = "Hello Kotlin!\n"
str += "Welcome to our class!"
我们在看一个例子:
字符串字面值
有两种类型的字符串字面值: 转义字符串可以有转义字符,以及原始字符串可以包含换行以及任意文本。转义字符串很像 Java 字符串:
val s = "Hello, world!\n"
转义采用传统的反斜杠方式。参见上面的 字符 查看支持的转义序列。
原始字符串 使用三个引号(""")分界符括起来,内部没有转义并且可以包含换行以及任何其他字符:
val text = """
for (c in "foo")
print(c)
"""
字符串模板
字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成:
val i = 10
println(“i = $i”) // 输出“i = 10”
或者用花括号括起来的任意表达式:
val s = "abc"
println("$s.length is ${s.length}") // 输出“abc.length is 3”
原始字符串与转义字符串内部都支持模板。 如果你需要在原始字符串中表示字面值 $ 字符(它不支持反斜杠转义),你可以用下列语法:
val price = """
${'$'}9.99
"""