Kotlin学习笔记(一) 基本数据类型

来源:互联网 发布:met.sf.json tobean 编辑:程序博客网 时间:2024/05/17 08:10

提示:本文为作者阅读Kotlin中文站学习笔记,建议读者移步Kotlin中文站完整学习。

在Kotlin中,任何变量都是对象,从这个意思上讲我们可以在任何一个变量上调用成员函数和属性。

数字

Kotlin提供了以下的内置类型表示数字:

TypeBit WidthDouble64Float32Long64Int32Short16Byte8

注意:Kotlin中字符不是数字。

我们可以用以下方式表示一个数字字面值:

  • 十进制 :123或56L
  • 16进制: 0x0f
  • 二进制:0b00001011

注意:数字字面值表示不支持八进制。

我们可以用以下形式表示一个浮点数字面值:

  • 默认是Double类型:123.0,123.5e10
  • 如果是Float类型,要在后面家F或f标记:123.0f

我们可以在数字字面量中加下划线,使其更易读:

val oneMillion=1_000_000;//一百万

在Java平台数字是物理存储为JVM的原生类型,但当我们需要一个可空的引用或者泛型时,会对数字装箱。

装箱不具有同一性:

val a:Int=100;val boxedA:Int?=a;val boxedA2:Int?=a;print(boxedA===boxedA2);//false 装箱不具备同一性

但是具有相等性

val a:Int=100;val boxedA:Int?=a;val boxedA2:Int?=a;print(boxedA==boxedA2);//true 装箱具备相等性

由于不同的表达方式,在Kotlin中较小的数字类型并不是较大的数字类型的子类型,因此较小的数字类型不能隐式转化为较大的数字类型,也就是说在不进行显式转化的情况下,我们不能把一个Byte类型值赋值给一个Int变量:

val b:Byte=1;val c:Int=b;//错误 不能隐式把一个Byte类型转化为Int类型

只能通过显示转换来拓宽数字

val b:Byte=1;val c:Int=b.toInt();//显式转换来拓宽数字

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

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

缺乏隐式类型转换并不显著,因为类型会从上下文中判断出来:

val l=1L+3;//Long+Int=>Long

Kotlin支持数字运算的标准集,运算被定义为相应的类成员(但编译器会将函数调用优化为相应的指令)。
对于位运算,没有特殊字符来表示,只能用中缀方式调用命名函数:

val x = (1 shl 2) and 0x000FF000

完整的位运算列表(只用于Int,Long):

  • shl(bits):有符号左移(Java的<<)
  • shr(bits):有符号右移(Java的>>)
  • ushr(bits):无符号右移(Java的>>>)
  • and(bits):位与
  • or(bits):位或
  • xor(bits):位异或
  • inv():位非

字符

字符类型用Char表示,不能直接当作数字

fun check(c:Char):Boolean{    if(c==1){//错误 不能直接当作数字    }}

字符字面值用单引号括起来:'1'。特殊字符可以用反斜杠转义。Kotlin支持的转移序列:\t、 \b、\n、\r、\'、\"、\\ 和 \$。转移其他字符要用Unicode系列转移语法:'\uFF00'

可以显式把字符转换为Int类型:

fun char2Int(c: Char): Int {    if (c !in '0'..'9') {        throw IllegalArgumentException("out of range");    }    return c.toInt();//将Char类型显式转换为Int类型}

布尔

布尔类型用Boolean表示,只有两个值:true,false。

内置的布尔运算有:

  • || 逻辑或
  • && 逻辑与
  • ! 逻辑非

数组

数组类型用Array表示,定义了get(),set()成员函数和size成员属性,以及其它一些有用的成员函数。

public class Array<T> {    public inline constructor(size: Int, init: (Int) -> T)    public operator fun get(index: Int): T    public operator fun set(index: Int, value: T): Unit    public val size: Int    public operator fun iterator(): Iterator<T>}

创建数组并赋值的3种方式:

1.使用库函数 arrayOf() 来创建一个数组并传递元素值给它,这样 arrayOf(1, 2, 3) 创建了 array [1, 2, 3]。

val b:Array<Int>=arrayOf(1,2,3)//[1,2,3]

2.库函数 arrayOfNulls() 可以用于创建一个指定大小、元素都为空的数组。

val c:Array<Int>=arrayOfNulls(3)[null,null,null]

3.用接受数组大小和一个函数参数的工厂函数,用作参数的函数能够返回给定索引的每个元素初始值:

val d:Array<Int>=Array(3,{i->i*i})//[0,1,4]

注意:与Java不同,Kotlin中数组是不型变的。这意味着我们不能把Array<string>赋值给Array<Any>,以防止可能的运行时错误。

Kotlin也有无装箱开销的专门的类来表示原生类型数组:ByteArray,ShortArray,IntArray等。这些类与Array没有继承关系,但它们有相同的方法属性集。

val e:IntArray= intArrayOf(1,2,3)//[1,2,3]

字符串

字符串类型String表示,字符串是不可变的。字符串中的元素字符可以使用索引运算符访问:s[]。可以用for循环遍历字符串

fun printStr():Unit{    val str:String="Hello World!"    for(c in str){        print(c)    }}

Kotlin支持两种形式字符串字面值:转义字符串可以有转义字符,原生字符串可以包含换行和任意文本。

转移字符串很像Java字符串

val str:String="Hello World!\nHello World"

原生字符串使用三个引号"""分界符括括起来,内部没有转移,可以包含换行和其它任意字符

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

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

val value:Int=5;val str:String="the value is $value"

或花括号括起来的任意表达式

val g:Int=2val h:Int=3val str:String="g+h=${g+h}"

转义字符串和原生字符串都支持模板字符串。如果想要在原生字符串中使用$(它不支持反斜杠转义),可以使用以下语法:

val str:String="""the price is ${'$'}199"""