美文网首页Google力荐的现代语言Kotlin——学完你就会喜欢
Kotlin:基本类型都是对象,原生类型将成为回忆

Kotlin:基本类型都是对象,原生类型将成为回忆

作者: 1024工场 | 来源:发表于2017-08-08 01:31 被阅读22次

    在Kotlin中,所有东西都是对象,我们可以在任何变量(如基本类型:数字、字符、布尔、数组与字符串等)上调用成员函数和属性。

    一、数字


    1. 内置类型种类

    类型 比特宽度
    Double 64
    Float 32
    Long 64
    Int 32
    Short 16
    Byte 8

    Kotlin提供了如下内置类型来表示数据(和Java很近);

    类型 比特宽度
    Double 64
    Float 32
    Long 64
    Int 32
    Short 16
    Byte 8

    Java对比:在Kotlin中,字符不是数字;

    2. 字面常量的表示

    整数字面值有如下几种:

    • 十进制:123,Long类型使用大写L标记:123L;
    • 十六进制:0x0F;
    • 二进制:0b00001011;

    注意:不支持八进制;

    浮点数常规表示如下:

    • 默认double:123.5、123.5e10;
    • Float用f或者F标记:123.5f;

    使用下划线使数字常量更易阅读

    //如果数字位数,信用号,进制数据分隔易于阅读
    val oneMillion = 1_000_000
    val creditCardNumber = 1234_5678_9012_3456L
    val hexBytes = 0xFF_EC_DE_5E
    val bytes = 0b11010010_01101001_10010100_10010010
    

    3. 可空引用或泛型才数字装箱

    Kotlin运行在Java平台,数字物理存储为JVM的原生类型, 除非需要可空的引用(如Int?)或泛型,才会把数字装箱
    数字装箱不保留同一性,它保留了相等性

    val a: Int = 10000
    //a分别装箱为boxedA何anotherBoxedA
    val boxedA: Int? = a
    val anotherBoxedA: Int? = a
    //输出false,boxedA和anotherBoxedA不是一个对象
    print(boxedA === anotherBoxedA)
    //输出trud,但是两个对象的值相等
    print(boxedA == anotherBoxedA)
    

    4. 不支持隐士转换只能显示转换

    由于不同的表示方式,较小的类型不是较大类型的子类型。因此较小的类型不能隐士转换成较大类型;
    可以显示转换来拓宽数字,每个数字类型都支持如下方法:

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

    缺乏隐式转换影响并不大,类型会从上下文推断算术运算会重载做适当转换;

    // 字面值是静态检测为Byte类型
    val b: Byte = 1
    // 错误,b为Byte类型,不能隐士转换层较大的Int类型 
    val i: Int = b 
    // 正确,通过toInt显式拓宽为Int;
    val i: Int = b.toInt() 
    // Long + Int 为 Long
    val l = 1L + 3 
    

    5. 运算定义成类成员

    Kotlin支持数字运算标准集运算被定义成相应的类成员
    对于位运算,没有特殊字符表示,只可用中缀方式调用命名函数。完整位运算列表(只用于Int和Long)如下:

    shl(bits):有符号左移,如Java中<<
    shr(bits):有符号右移动,如Java中>>
    ushr(bits):无符号右移,如Java的>>>
    and(bits):位与
    or(bits):位或
    xor(bits):位异或
    inv():位非
    
    val x = (1 shl 2) and 0x000FF000
    

    二、字符


    1. 字符的表示

    字符使用Char表示,它们不能直接当作数字;

    fun check(c: Char) {
        //字符不能当做数字;
        if (c == 1) {
            // ……
        }
    }
    

    2. 字符的转义

    字符字面值用单引号括号起来:'1';
    特殊字符使用反斜杠转义,如:\t、\b、\n、\r、'、"、\和$等;
    编码字符使用Unicode转义序列语法:'\uFF00';

    3. 字符可显示转换

    可以显示把字符转换为Int数字

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

    当需要可空引用时,像数字、字符会被装箱。装箱不会保留同一性

    三 、布尔值


    1. 布尔值用Boolean类型表示,它有两个值:true和false;
    2. 若需要可空引用布尔值会被装箱
    3. 内置布尔值运算有:||-短路逻辑或、&&-短路逻辑与和!-逻辑非;

    三、数组


    1. 数组的表示

    数组在Kotlin中使用Array类来表示

    2.数组的函数

    定义了get和set函数(按照运算符重载约定会转变为[])和size属性,以及一些其它有用成员函数;

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

    3. 数组的创建

    数组使用库函数arrayOf()来创建数组,并传递元素值给它;
    或者使用arrayOfNulls()可以创建指定大小,元素都为空的数组
    用接受数组大小和一个函数参数的工厂函数用作参数,函数返回给定索引的每个元素初始化值

    var array= arrayOf(1, 2, 3)
    var nullArray = arrayOfNulls<Int>(5)
    //创建一个 Array<String> 初始化为 ["0", "1", "4", "9", "16"]
    val asc = Array(5, { i -> (i * *).toString() })
    

    Java对比: Kotlin中数组是不型变的,意味着Kotlin不让我们把Array<String>赋值给Array<Any>,防止可能运行时失败;

    4. 原生类型数组

    Kotlin有无装箱开销的专门类来表示原生类型数组:ByteArray、ShortArray、IntArray等;
    它们和Array没有继承关系,有同样的方法属性集,有相应的工厂方法;

    val x: IntArray = intArrayOf(1, 2, 3)
    x[0] = x[1] + x[2]
    

    四、字符串


    1. 字符串的表示

    字符串用String类型表示,是不可变的
    字符串的元素—字符可以使用索引运算符访问:s[i],可以用for循环迭代字符串;

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

    原生字符串使用三个引号(""")分界符号括起来,内部没有转义并且可以包含换行和任何其他字符

    val text = """
        //内部不需要使用转义字符\"
        for (c in "foo")
            print(c)
    """
    

    2. 字符串字面值

    Kotlin有两种类型字符串字面值:转义字符串可以有转义字符原生字符串可以包含换行和任意文本

    val s = "Hello, world!\n"
    

    3. 字符串模板

    字符串可以包含模板表达式,即一小段代码,会求值并把结果合并到字符串中;
    模板表达式以美元符号($)开头,由一个简单的名字构成

    val i = 10
    // 求值结果为 "i = 10"
    val s = "i = $i"
    

    或者使用花括号括起来任意表达式;

    val s = "abc"
    // 求值结果为 "abc.length is 3"
    val str = "$s.length is ${s.length}"
    

    原生字符串和转义字符串内部都支持模板,如果你需要在原生字符串中标识字面值$字符(它不支持反斜杠),可用如下语法:

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

    1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)

    1024工场服务号
    2.加入“Kotlin开发”QQ讨论群,一起学习一起Hi。(甭客气!尽情的扫描或者长按!)
    Kotlin开发群

    相关文章

      网友评论

        本文标题:Kotlin:基本类型都是对象,原生类型将成为回忆

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