欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

kotlin基本数据类型

程序员文章站 2024-03-14 22:57:35
...

在 Kotlin 中,所有东西都是对象,在这个意义上讲我们可以在任何变量上调用成员函数和属性。Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于Java的是,字符不属于数值类型,是一个独立的数据类型。

Kotlin 中没有基础数据类型,只有封装的数字类型,你每定义的一个变量,其实 Kotlin 帮你封装了一个对象,这样可以保证不会出现空指针。数字类型也一样,所有在比较两个数字的时候,就有比较数据大小和比较两个对象是否相同的区别了。

在 Kotlin 中,三个等号 === 表示比较对象地址,两个 == 表示比较两个值大小。

fun main(args: Array<String>) {
    val a: Int = 10000
    println(a === a) // true,值相等,对象地址相等

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

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

这里我把 a 的值换成 100,这里应该跟 Java 中是一样的,在范围是 [-128, 127] 之间并不会创建新的对象,比较输出的都是 true,从 128 开始,比较的结果才为 false。

java和kotlin都是一样的:

btye 1个字节
short 2个字节
int 4个字节
long 8个字节
float 4个字节
double 8个字节

类型转换

byte - (short , char) - int - long - float - double
较小的类型不能隐式转换为较大的类型(而java中是可以隐式的自动类型转化的)

java中
自动类型转换:由优先级低的数据类型转向优先级高的数据类型。 
        举例:char  c = 10 ; 
             int b = c ; 
             long d = c ; 

强制类型转换:由优先级高的数据类型转向优先级低的数据类型。 
        举例: float  f = 3 ; 
              int  a = f ; (编译器会报错),正确的写法是:int  a  =(int) f ; 
很显然,这样的转换可能会导致数据溢出或是精度下降。
kotlin中
较小的类型不能隐式转换为较大的类型

val b: Byte = 1 // OK, 字面值是静态检测的
val i: Int = b // 错误

val b: Byte = 1 // OK, 字面值是静态检测的
val i: Int = b.toInt() // OK

每种数据类型都有下面的这些方法,可以转化为其它的类型:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char

字面常量

数值常量字面值有以下几种:

十进制: 123
Long 类型用大写 L 标记: 123L
十六进制: 0x0F
二进制: 0b00001011
注意: 不支持八进制

Kotlin 同样支持浮点数的常规表示方法:

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

字符

和 Java 不一样,Kotlin 中的 Char 不能直接和数字操作,Char 必需是单引号''包含起来的。比如普通字符 '0','a'。

数组

数组用类 Array 实现,并且还有一个 size 属性及 get 和 set 方法,由于使用 [] 重载了 get 和 set 方法,所以我们可以通过下标很方便的获取或者设置数组对应位置的值。
与 Java 不同的是,Kotlin 中数组是不型变的(invariant)。
[] 运算符代表调用成员函数 get() 和 set()。
数组的创建两种方式:一种是使用函数arrayOf();另外一种是使用工厂函数。

fun main(args: Array<String>) {
//数组的创建(数组不可变)
    //一种是使用函数arrayOf();
    val a= arrayOf(1,3,3)

    //另外一种是使用工厂函数,接受数组大小和一个函数参数,用作参数的函数能够返回给定索引的每个元素初始值
    val b=Array(3, { i -> (i * 2) })//i取0,1,2

//for 循环
    for ( c in a.indices){
        println("a[$c]="+a[c])
    }
    for (d in b.indices){
        println("b[$d]="+b[d])
    }
输出:
a[0]=1
a[1]=3
a[2]=3
b[0]=0
b[1]=2
b[2]=4
}