美文网首页我的Kotlin之旅kotlin频道Android知识
Kotlin学习(四): 基本类型(Basic Types)

Kotlin学习(四): 基本类型(Basic Types)

作者: 叫我旺仔 | 来源:发表于2017-03-01 21:01 被阅读1127次
    Versatile

    本文是学习Kotlin的基本类型,Kotlin的基本类型与Java有一些不同,例如整数类型,Java是int表示,而Kotlin是Int表示;例如布尔类型,Java是boolean表示,而Kotlin是用Boolean表示。

    在 Kotlin 中,所有变量的成员方法和属性都是一个对象,我们可以在任何变量上调用成员函数和属性。
    在本文中,将会讲解经常被使用的类型:NumbersCharactersBooleansArraysStrings

    Numbers(数值)

    Kotlin处理数值的方式与Java类似,单又不完全相同,例如,数值没有隐式扩展转换,在默写情况下文字也略有不同。
    Kotlin 提供了如下内建数值类型(与Java类似)

    Type Bit width(字宽)
    Double 64
    Float 32
    Long 64
    Int 32
    Short 16
    Byte 8

    注意:字符不是kotlin中的数值类型

    字面常量(Literal Constants)

    对于整数值,有以下几种常量

    • 整型: 123
      • 长整型要加 L: 123L
    • 16进制: 0x0F
    • 二进制: 0b00001011

    对于浮点数值

    • Doubles类型: 123.5, 123.5e10
    • Floats类型要加 f or F: 123.5f

    注意:不支持8进制

    数值中的下划线(1.1版开始)

    Java8支持数值使用下划线类分割数字分组,可以使用下划线使数字常量更易读:

    val oneMillion = 1_000_000
    val hexBytes = 0xFF_EC_DE_5E
    val bytes = 0b11010010_01101001_10010100_10010010
    

    等同于

    1000000
    ffecde5e
    11010010011010011001010010010010
    

    表示法(Representation)

    在Java平台上,数值被 JVM 虚拟机以字节码的方式物理存储的,除非我们需要做可空标识(比如说 Int?) 或者涉及泛型。

    val a: Int = 10000
    print(a === a) // 打印'true' ,与Java的‘===’一样
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a
    print(boxedA === anotherBoxedA) // 打印`false`
    

    另一方面,值是相等的

    val a: Int = 10000
    print(a == a) // 打印 'true'
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a
    print(boxedA == anotherBoxedA) // 打印 'true'
    

    显式转换(Explicit Conversions)

    由于不同的表示,短类型不是长类型的子类型

    //这是些伪代码,不能编译的
    val a: Int? =1 // Int (java.lang.Integer)
    val b: Long? = a // Long (java.lang.Long)
    print( a == b ) // 打印 'false' ,由于 Long 类型的 equals() 只有和 Long 比较才会相同
    

    短类型是不会隐式(自动)转换为长类型的,需要显示(手动)转换才行

    val b: Byte = 1 // 
    val i: Int = b // 错误,不能自动转换
    

    改为显示(手动)转换

    val i: Int = b.toInt() // 成功
    

    数值类型支持的转换有下面几种

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

    Kotlin会自动转换类型的,比如

    val l = 1.toLong + 1 // Long  + Int => Long,自动转换成Long类型
    

    运算符(Operations)

    Kotlin支持标准的算术运算表达式,这些运算符被声明为相应类的成员。
    对于位操作,没有特殊的字符,只是命名的函数可以以中缀形式调用,例如

    val x = (1 shl 2) and 0x000FF000
    

    支持的位运算操作符有(仅适用于IntLong类型)

    • shl(bits) – 带符号左移 (相当于 Java的 <<)
    • shr(bits) – 带符号右移 (相当于 Java的 >>)
    • ushr(bits) – 无符号右移 (相当于 Java的 >>>)
    • and(bits) – 按位与
    • or(bits) – 按位或
    • xor(bits) – 按位异或
    • inv() – 按位翻转

    Characters(字符)

    字符类型用 Char 表示,不能直接当做数值来使用

    fun check(c: Char) {
        if (c == 1) { // 错误:类型不匹配
            // ...
        }
    }
    

    字符文字用单引号括起来:'1',可以使用反斜杠转义特殊字符,支持以下转义序列:\ t,\ b,\ n,\ r,',\“,\和\ $。
    要编码任何其他字符,使用Unicode转义序列语法:'\ uFF00'。

    下面是将字符类型显示(手动)转换成Int类型

    fun decimalDigitValue(c: Char): Int {
        if (c !in '0'..'9') 
            throw IllegalArgumentException("Out of range")
        return c.toInt() - '0'.toInt() // 显示转换为数值类型
    }
    

    Boleans(布尔值)

    Kotlin的Boolean同Java的boolean类型一样,只有truefalse

    Boolean的操作同Java一样

    • || – 或者
    • && – 并且
    • ! - 非

    Arrays(数组)

    Kotlin中的数组由Array表示,通过[]调用getset方法,支持size属性,以及其他,下面是Array代码

    class Array<T> private constructor() {
        val size: Int
        fun get(index: Int): T
        fun set(index: Int, value: T): Unit
    
        fun iterator(): Iterator<T>
        // ...
    }
    

    可以使用 arrayOf() 创建Array,arrayOf(1, 2, 3) 创建了一个[1, 2, 3] 的数组。
    可以使用 arrayOfNulls() 创建一个指定大小的空Array。

    另外也可以使用工厂函数,该函数采用数组大小​​和函数,该函数可以返回每个数组元素的索引的初始值

    // 创建 Array<String> 内容为 ["0", "1", "4", "9", "16"]
    val asc = Array(5, { i -> (i * i).toString() })
    

    注意:和 java 不一样,arrays 在 kotlin 中是不可变的。这意味这 kotlin 不允许我们把 Array<String>转为 Array<Any>,这样就阻止了可能的运行时错误(但可以用 Array<outAny>)

    Kotlin 有专门的类来表示原始类型: ByteArray, ShortArray, IntArray 等等。这些类与Array类没有继承关系,但它们具有相同的方法和属性集。也有相应的工厂功能

    val x: IntArray = intArrayOf(1, 2, 3) // 创建一个Int类型的Array
    x[0] = x[1] + x[2]
    

    Strings(字符串)

    字符串由类型String表示,字符串是不可变的。字符串的元素是可以通过索引操作访问的字符:s [i]。一个字符串可以用一个for循环迭代

    for (c in str) {
        println(c)
    }
    

    字符串字面量(String Literals)

    Kotlin 有两种类型的 String :一种是可以带分割符的,一种是可以包含新行以及任意文本的。
    带分割符的 String 与Java 的 String类似

    val s = "Hello World!\n"
    

    如果String 是由三个引号包裹的("""),不可以包含分割符但可以包含其它字符:

    val text = """
        for (c in "foo")
            print(c)
    """
    

    可以使用trimMargin()来删除空格

    val text = """
        |Tell me and I forget.
        |Teach me and I remember.
        |Involve me and I learn.
        |(Benjamin Franklin)
        """.trimMargin()
    

    默认为|用作边距前缀,可以选择另一个字符并将其作为参数传递,如trimMargin(“>”)

    字符串模版(String Templates)

    字符串可以包含模板表达式,前面介绍了可以使用'${}'模版表达式

    val s = "abc"
    val str = "$s.length is ${s.length}" //识别为 "abc.length is 3"
    

    还有一种是可以使用$模版表达式

    val i = 10
    val s = "i = $i" // 识别为 "i = 10"
    

    模版表达式同样可以用于由三个引号包裹的String,如下面的,${"$"}表示$符号

    val price = """
    ${'$'}9.99
    """
    

    相关文章

      网友评论

      • 冬虫不可以语夏:您好,您这这做笔记的工具是简书自带的还是别的?感觉写出来代码好整齐,可以告诉我一下吗?
        三棵柚子:旺仔,你写的太文艺了!专业术语好强 ,要是写的通俗易懂一点的话 就更好了!!!我是柚子哦
        冬虫不可以语夏:@叫我旺仔 谢谢
        叫我旺仔:简书自带的,写久了就会习惯。。

      本文标题:Kotlin学习(四): 基本类型(Basic Types)

      本文链接:https://www.haomeiwen.com/subject/gfeowttx.html