前言
你们好,这里是「从零开始学 Kotlin 之『2 』数据类型」,本文首发于公众号「Binguner」,欢迎前往你们关注。我会每周分享一些关于 Android 和其余方向的技术干货或一些关于认知的文章。学习一门技术最好的方式就是去教会别人,因此,开始今天的学习吧!java
Kotlin 中的数据类型有基本数据类型和应用类型:正则表达式
而且对于基本的数据类型(相似于 int,float 等),Kotlin 不会区分其是数据类型仍是包装类型,在运行的时候,数据会用最高效的方式显示。ide
Kotlin 提供了与 Java 相似的数字类型函数
类型 | 位宽度 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
可是要注意:Kotlin 中没有隐式转换(就像 Java 中能够把 Int 转换为 Long),想要进行数字转换,须要使用转换函数:学习
val a:Byte = 1 val b:Int = a // 错误,编译器会提示所需类型为 Int,而提供的类型为 Byte val c:Int = a.toInt() // 成功
每种数字类型都支持如下的数字转换方法:测试
装箱是指将基本数据类型转换为其对应的包装器类型,
拆箱就是将包转器类型转换为基本数据类型。spa
在 Java 中:指针
Integer x = 123; // 是一个装箱操做 int y = x; // 是一个拆箱操做
而 Kotlin 中如何装箱拆箱呢?code
val i1 = 123 // 拆箱 val i2:Int? = 123 // 装箱
想要了解其背后具体原理,能够本身动手将 Kotlin 代码编译成 Java 字节码一探究竟。视频
为基本数据类型赋值的值称为字面常量。
Kotlin 中的字面常量有如下三种:
相似:123,Long 类型的用大写 L 标记:123L
相似:0x0F
相似:0b00001011
另外,Kotlin 并不支持八进制。但却默认支持 Double 和 Float。
例如:123.5,123.4e10,123f,123F 这些在 Kotlin 中都是支持的。
在声明字面常量时,Kotlin 支持下划线的声明方式,使数字更加的易读:
val oneMillion = 1_000_000 val creditCardNumber = 1234_5678_9012_3456L val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010
Kotlin 中的字符使用 Char 表示,字符不能直接被看成数字来处理,必须经过 toInt() 方法被字符转换为数字类型
fun charToInt(c:Char):Int{ return c.toInt() }
Char 类的字面量用「' '」括起来,支持以下的转义序列:
Kotlin 中的字符串和 Java 同样用 String 申明,且不可变的。可是 Kotlin 中的字符串有一些新的特性。
val str = "Hello world!" for (i in 0..str.length-1){ print("${str[i]}_") } // 输出 H_e_l_l_o_ _w_o_r_l_d_!_
val s = "Hello" + '_' println(s + "World") // 输出 Hello_World
println("123_456_789".split("_".toRegex())) // 输出 [123, 456, 789]
用其它方法分割字符串
val str = "Hello world!" println("substring1: ${str.substring(5)}") println("substring2: ${str.substring(0..4)}") println("substring3: ${str.substring(6,12)}") println("substringBefore: ${str.substringBefore(" ")}") println("substringAfter: ${str.substringAfter(" ")}") println("substringAfter: ${str.substringBeforeLast(" ")}") println("substringAfterLast: ${str.substringAfterLast(" ")}") // 运行结果: substring1: world! substring2: Hello substring3: world! substringBefore: Hello substringAfter: world! substringAfter: Hello substringAfterLast: world!
原始字符串用先后 3 个引号包围
val rawStr = """ The first line, the second line, the third line. """.trimIndent() // 注意:若是「"""」所在行只有空格,这个方法会省略这些空白 println(rawStr) // 输出: The first line, the second line, the third line.
原始字符串一般还用 trimMargin() 处理,trimMargin() 的参数是一个边界前缀字符串,默认的参数是「|」,例以下面的例子,每一行的开头是「|」,那么就会以每一行的「|」为输出的开头进行字符输出。
val rawStr = """ | The first line, |the second line, |the third line. """.trimMargin("|") // 输出: The first line, the second line, the third line.
Kotlin 中的布尔类型用 Boolean 表示,它的值有 true 和 false。
若须要可空引用时,布尔类型的值会被装箱。
它支持的运算有:
Kotlin 致力于消除 NullPointerException 带来的影响。在 Java 中若是咱们尝试引用一个空的对象,就会致使空指针异常,可是在 Kotlin 中则不会。下面,咱们来看看 Kotlin 是怎么作到的。
Kotlin 对可空类型和非空类型作了区分,例如:「Int」不可空,「Int?」可空
var str :String? = null println(str?.length) // 输出 null,而不是报空指针异常
在引用可空类型的时候,为了不空指针异常,Kotlin 要求必须进行非空检查:
var str :String? = "Hellp" // val length1 = str.length 这样直接引用的时候,编译器会报错 // Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? // 必须在可空类型上使用可空和非空断言。 val length = str?.length // 此时若是 str 为空,运行返回 null val length2 = str!!.length // 此时若是 str 为空,运行会抛出异常 // 或者进行类型检查 val length3 = if(str != null) str.length else 0
Any 是 Kotlin 中全部非空类型的超类,至关于 Java 中的 Object。
可空类型的超类是 Any?
Unit 能够做为函数的返回类型,表示没有返回值或者返回值能够忽略。
注意 Unit 是一个类,而且继承自 Any。
这是定义它的源代码:
public object Unit { override fun toString() = "kotlin.Unit" }
能够看到 Unit 是用 object 定义的单例类型,调用它的 toString() 方法,只会返回 「Kotlin.Unit」。
而且 Unit 的返回类型会返回 Unit 类型!!!
fun test(){} val t = test() println(t::class.java) // 输出 class kotlin.Unit
Kotlin 中函数返回类型若是用 Nothing 表示,则这个函数永远不会返回任何类型。
一些测试函数不会返回任何类型,就须要声明返回类型为 Nothing,它们一般抛出异常来结束运行。
fun test(msg:String):Nothing{ throw IllegalStateException(msg) } test("test") // 此时程序会抛出异常:Exception in thread "main" java.lang.IllegalStateException: test
「从零开始学 Kotlin 之『2』数据类型」到这里就结束了。
一下记住这么多知识点有些困难,因此为了方便你们的记忆与复习,我作了一张思惟导图放到下面,你们能够把图片保存下来,有时间便去回顾学到的东西。
推荐阅读:
欢迎关注本文做者,这个系列的文章会首发在这里:
扫码关注 + 回复「kotlin」,获取我整理的最新版 Kotlin 学习视频。