写给 Java 开发者的 Kotlin 教程 (3) - 数据类型

Kotlin 的第一个特点就是一门 静态类型 语言,所以先从如何在 Kotlin 中声明变量,Kotlin 如何推断变量的类型,以及 Kotlin 支持创建变量的基本数据类型开始我们的学习之旅。
变量
数字类型
| 类型 | Bits |
|---|---|
| Double | 64 |
| Float | 32 |
| Long | 64 |
| Int | 32 |
| Short | 16 |
| Byte | 8 |
敲黑板: 字符类型在 Kotlin 不是 Number类型
显式转换
我们先看一个例子,再来理解这个特性
1 | val b: Byte = 1 |
1 | byte a = 1; |
Kotlin 提供一系列的数据转换的函数,如下:
- toByte(): Byte
- toShort(): Short
- toInt(): Int
- toLong(): Long
- toFloat(): Float
- toDouble(): Double
- toChar(): Char
算术操作
Kotlin 支持标准的 算术操作 比如 左移 右移 和 Java 不同的 Kotlin 认为这些也是标准的函数
举个例子
1 | val x = (1 shl 2) and 0x000FF000 |
1 | int x = 1 << 2 & 0x000FF000; |
- shl(bits) – 有符号左移 (Java’s <<)
- shr(bits) – 有符号右移 (Java’s >>)
- ushr(bits) – 无符号右移 (Java’s >>>)
- and(bits) – 与操作
- or(bits) – 或操作
- xor(bits) – 异或操作
- inv() – 反转操作
好奇的你,肯定想问为什么可以写成 val x = (1 shl 2) and 0x000FF000 这样的语法,其实这个在很多语言中也有
也就是所谓的 中缀表达式 这里的内容会在 函数 中细说。所以聪明的你也会联系到是否 + - * % 也如此。
的确如此……
| 表达式 | 函数表示 |
|---|---|
| a + b | a.plus(b) |
| a - b | a.minus(b) |
| a * b | a.times(b) |
| a / b | a.div(b) |
| a % b | a.rem(b) |
| a++ | a.inc() |
| a−− | a.dec() |
| a > b | a.compareTo(b) > 0 |
| a < b | a.compareTo(b) < 0 |
| a += b | a.plusAssign(b) |
字符类型
字符文字用单引号括起:如 ‘1’。可以使用反斜杠转义特殊字符。支持以下转义序列:\t,\b,\n,\r,\,\",\\和\$。要对其他字符进行编码,需要使用 Unicode 转义序列语法:'\uFF00'
数组类型
在 Kotlin 将 java 中的数据转换为了 Array 类
1 | class Array<T> private constructor() { |
Kotlin 创建一个数组提供一些列简单的函数来帮助我们创建数组,比如
1 | val x = arrayOf(1, 2, 3) |
1 | int[] a = new int[]{1,2,3,4}; |
除此之外 Kotlin 为 Array 增加了更多的方便操作的函数。举个例子
1 | var xx = arrayOf(1, 2, 3, 4) |
字符串
字符串字面值
创建一个单行的字符串 s 这个和 java 一样。
1 | val s = "Hello, world!\n" |
但是 Kotlin 支持多行 String
1 | val text = """ |
1 | String text = "select \* from users\n" + |
这个特性在我们需要输出比较复杂的 Sql或者是多行文本的情况下是极为方便的。
字符串模板
字符串可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模板表达式以美元符($)开头,由一个简单的名字构成:
1 | val i = 10 |
或者用花括号括起来的任意表达式
1 | val s = "abc" |
类型别名
类型别名可以为已有的类型提供替代的名称. 如果类型名称太长, 你可以指定一个更短的名称, 然后使用新的名称。
1 | typealias NodeSet = Set<Network.Node> |
常量
1 | const val SUBSYSTEM_DEPRECATED: String = "This subsystem is deprecated" |
小结
参考官方文档中还有 Boolean 与 Char 类型,这两个类型和 Java 是极为接近就不多做阐述。
而且我们从文中,我们可以发现,Kotlin 不存在 Java 中的 原始数据类型和包装数据类型,不存在 int Integer long Long byte Byte 的关系,也算是去除了 Java 中不太 OOP 的一部分。
Q&A
- Q: 执行位运算的执行顺序
A: 中缀函数调用的优先级低于算术操作符、类型转换以及 rangeTo 操作符,但是高于布尔操作符 && 与 ||、is- 与 in- 检测以及其他一些操作符,所以1 shl 2 + 3 === 1 shl (2 + 3)