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

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

一、数字

1. 内置类型种类

类型比特宽度
Double64
Float32
Long64
Int32
Short16
Byte8

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

类型比特宽度
Double64
Float32
Long64
Int32
Short16
Byte8

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工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)

《Kotlin:基本类型都是对象,原生类型将成为回忆》 1024工场服务号

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

《Kotlin:基本类型都是对象,原生类型将成为回忆》 Kotlin开发群

    原文作者:1024工场
    原文地址: https://www.jianshu.com/p/6306b63dae62
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞