Kotlin入门-万物皆对象,基础类型

在这里插入图片描述

Kotlin说:万物皆对象。

可以说,Kotlin全面的接管了所有类型。一统天下。

即是基础,那就需要,通盘了解。按目录来就行。也有Xmind版本 github地址

本文将从下面几个方面去讲解

  • 数字
    • 整数
    • 浮点数
    • 数字可添加下划线,更易读
    • 表示方式
    • 显式转换
    • 运算
    • 浮点数比较
  • 字符
  • 布尔值
  • 数组
  • 字符串
    • 字符串模板
    • 字符串字面值
  • 无符号

数字

数字包括 整数和浮点型

整数
类型 大小 限制
Byte 8位
Short 16位
Int 32位 所有不超过Int最大值的整数型初始化变量都被推断为Int
Long 64位 初始值超过Int最大值,推断为Long
注意
  • 不支持8进制
  • long以大写的 L 结尾:123L
  • 16 进制以 0x 开头:0x0F
  • 2 进制以 0b 开头:0b00001011

浮点数
类型 大小 限制 示例
Float 32位 使用 f 或者 F 后缀可 显式指定为Float类型 123.5f
Double 64位 以小数初始化的变量推断为Double 123.5, 123.5e10

数字可添加下划线,更易读

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


表示方式

数字的赋值会被默认装箱,即 新变量的定义,代表了新对象的产生

    val a: Int = 10000
    println(a === a) // true,值相等,对象地址相等

    //经过了装箱,创建了两个不同的对象
    val boxedA: Int? = a
    val boxedB: Int? = a

    //虽然经过了装箱,但是值是相等的,都是10000
    println(boxedA === boxedB) //  false,值相等,对象地址不一样
    println(boxedA == boxedB) // true,值相等

这里数值的比对

  • ===
    表示比较对象地址
  • ==
    表示比较两个值大小

boxedA跟boxedB的地址不同,
赋值,就是重新new 两个对象


显式转换

每种数值都是独立的
较小类型并不是较大类型的子类型
数值类型之前,必须通过显式的转换

范例

val b: Byte = 1 // OK, 字面值是静态检测的
val i: Int = b // 错误
Type mismatch: inferred type is Byte but Int was expected
val i: Int = b.toInt() // OK:显式拓宽

类型推断可以

  • 从上下文得出
  • 有重载做适当转换
  • val l = 1L + 3 // Long + Int => Long

每个数字类型支持如下的转换:

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • oChar(): Char

运算

这部分基本跟与java一样
位运算

  • 没有特殊字符来表示
  • 只可用中缀方式调用命名函数
val x = (1 shl 2) and 0x000FF000

位运算列表如下(只用于Int和Long类型)

  • shl(bits) – 左移位 (Java’s <<)
  • shr(bits) – 右移位 (Java’s >>)
  • ushr(bits) – 无符号右移位 (Java’s >>>)
  • and(bits) – 与
  • or(bits) – 或
  • xor(bits) – 异或
  • inv() – 反向

浮点数比较

与java一样的部分:

  • 相等性检测:a == b 与 a != b
  • 比较操作符:a < b、 a > b、 a <= b、 a >= b
  • 区间实例以及区间检测:a…b、 x in a…b、 x !in a…b

若a\b的类型已知或可推导。
当这些操作数并非静态类型为浮点数,会出现

  • 认为 NaN 与其自身相等
  • 认为 NaN 比包括正无穷大(POSITIVE_INFINITY)在内的任何其他元素都大
  • 认为 -0.0 小于 0.0

字符

  • 大体与java一样
  • 用 Char 类型表示
  • Char 必需是单引号 ’ 包含起来的

和 Java 不一样部分
Kotlin 中的 Char 不能直接当作数字,与数字操作


布尔

与java一样

数组

创建两种方式
arrayOf(1, 2, 3)
// 创建一个 Array<String> 初始化为 ["0", "2", "4"]
Array(3, { i -> (i * 2) })

Array中的{}代表了进行数值生成

若{}中没有内容,则输出Kotlin.Unit(Unit约等于void)

除了类Array,还有ByteArray, ShortArray, IntArray
范例
// Array of int of size 5 with values [0, 0, 0, 0, 0]
val arr = IntArray(5)

// e.g. initialise the values in the array with a constant
// Array of int of size 5 with values [42, 42, 42, 42, 42]
val arr = IntArray(5) { 42 }

// e.g. initialise the values in the array using a lambda
// Array of int of size 5 with values [0, 1, 2, 3, 4] (values initialised to their index value)
var arr = IntArray(5, { it * 1 })

这个范例很好的解释了初始化数值会如何生成


字符串

字符串是不可变的。改变字符串,本质是重新赋值一个新的字符串。

字符串模板
  • 模板表达式以美元符($)开头
  • 用花括号括起来的任意表达式
"i = $i"
"$s.length is ${s.length}" //输出“abc.length is 3”
val price = """
${'$'}9.99
"""
// 输出$9.99  
字符串字面值
原始字符串 使用三个引号(""")
  • 默认 | 用作边界前缀
  • 可以选择其他字符并作为参数传入
  • 比如 trimMargin(">")

范例

val text = """
    |Tell me and I forget.
    |Teach me and I remember.
    |Involve me and I learn.
    |(Benjamin Franklin)
    """.trimMargin()
转义字符串 使用一个引号(")

无符号

无符号类型自 Kotlin 1.3 起才可用,并且目前是实验性的。

既然是实验性的,了解就好。等稳定了再用吧。
大致就是这样的东西。

kotlin.UByte
kotlin.UShort
kotlin.UByteArray
kotlin.ULongArray
val b: UByte = 1u  // UByte,已提供预期类型
val s: UShort = 1u // UShort,已提供预期类型
val l: ULong = 1u  // ULong,已提供预期类型

val a1 = 42u // UInt:未提供预期类型,常量适于 UInt
val a2 = 0xFFFF_FFFF_FFFFu // ULong:未提供预期类型,常量不适于 UInt

附上 github地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章