这节课我们先来看看 Kotlin 中都有哪些基本数据类型。
一切皆对象和 Java 不同,在 Kotlin 的世界中,一切皆为对象。基本数据类型会被自动装箱成对象(但不支持拆箱),都可以访问成员函数和属性。
基本类型在 Kotlin 中,总共有5种基本数据类型,他们分别是数字、字符、布尔、数组和字符串。
数字和常见的高级编程语言类似,在 Kotlin 中,对于数字的表示,有整数和浮点(小数)之分。
整数Kotlin 提供了4种方式来表示整数,它们所占的大小各有不同,取值范围也会随之变化,下表列出了4种整数类型的详细情况:
类型 大小(bits) 最小值 最大值Byte 8 -128 127
Short 12 -32768 32767
Int 32 -2147483648 2147483647
Long 64 -9223372036854775808 9223372036854775807
默认情况下,在赋值时,只要数值未超过 Int 的取值范围,Kotlin 都会将其推断为 Int 类型。否则,会推断为 Long 类型。当然,我们也可以在赋值时加上“L”后缀,以显式指定变量为 Long 型。
此外,Kotlin 还支持 16 进制和 2 进制的数值表示法。当要表示 16 进制时,其值以“0x开头”;当要表示 2 进制时,其值以“0b”开头;8 进制在 Kotlin 中是不被支持的。
为了阅读方便,自 Kotlin 1.1 起,我们可以给数字添加下划线,以增强数值的可读性。
以下是一些例子:
Kotlin 提供了两种类型用来表示浮点值,即单精度和双精度。和整数类似,这两种类型大小不同,表示的数值范围也有所差异,具体见下表:
类型 大小(bits) 有效数字比特数 指数比特数 十进制位数Float 32 24 8 6-7
Double 64 53 11 15-16
默认情况下,在赋值时,编译器会默认按照 Double 类型初始化浮点变量。如果我们需要将一个变量显式指定为 Float 类型,需要在值后面加上“F”(大小写皆可) 后缀。特别注意:显式指定时,超过 Float 范围的部分将丢失精度,末位会四舍五入。
参考下面的代码示例:
Kotlin 并不支持类型“隐式拓宽转换”。
何为隐式拓宽转换呢?
上面这段代码中,首先定义了一个值为1的数字变量 intSample,随后实现了一个名为 doubleOutput() 的方法。现在我们还没学过“方法”,不过没关系,我们暂且将其理解成需要一个浮点(Double)类型变量的事物。随后,我们调用了这个方法,将 intSample 的整数类型值交给它。
大家猜猜看,运行这段代码,会有怎样的结果呢?
想好了吗?
答案是:这段代码根本无法正常运行!
结合之前的知识,我们知道,intSample 将会默认成为一个 Int 类型的变量,而 doubleOutput() 方法需要一个浮点 Double 类型。Kotlin 并不支持自动隐式由 Int -> Double 类型的变换。所以语法错误,代码无法运行。这一点和 Java 是完全不同的,如果您之前一直使用 Java 编程语言,要特别注意这一点。
现在,请思考:如果将上述代码改为:
如此修改,代码可以运行吗?如果可以的话,运行结果会是怎样的呢?
答案是——代码依旧无法运行,因为 Float 无法隐式转为 Double。
再来思考,阅读下面的代码片段:
问题:这段代码可以运行吗?运行结果是多少呢?
答案是:这段代码可以运行,运行结果为3。最终,result 类型为Long。
如何理解呢?
变量 result 最终的类型是根据上下文推断出来的。代码中,存在算术运算符(我们以后会讲到),这一操作中,隐式地完成了类型转换,即:
Long + Int => Long, 算术运算符会有重载做合适的类型转换。
那么,除了算术运算符,有没有办法完成类型转换呢?
答案是肯定的,即显式转换。
在 Kotlin 中,每个数字类型都支持以下几种方式的显式转换:
toByte()
toShort()
toInt()
toLong()
toFloat()
toDouble()
toChar()