提示:本文为作者阅读Kotlin中文站学习笔记,建议读者移步Kotlin中文站完整学习。
在Kotlin中,任何变量都是对象,从这个意思上讲我们可以在任何一个变量上调用成员函数和属性。
数字
Kotlin提供了以下的内置类型表示数字:
Type | Bit Width |
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
注意:Kotlin中字符不是数字。
我们可以用以下方式表示一个数字字面值:
注意:数字字面值表示不支持八进制。
我们可以用以下形式表示一个浮点数字面值:
我们可以在数字字面量中加下划线,使其更易读:
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();//显式转换来拓宽数字
每个数字类型都支持如下的转换:
缺乏隐式类型转换并不显著,因为类型会从上下文中判断出来:
val l=1L+3;//Long+Int=>Long
Kotlin支持数字运算的标准集,运算被定义为相应的类成员(但编译器会将函数调用优化为相应的指令)。
对于位运算,没有特殊字符来表示,只能用中缀方式调用命名函数:
val x = (1 shl 2) and 0x000FF000
完整的位运算列表(只用于Int,Long):
字符
字符类型用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 {
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
}
创建数组并赋值的3种方式:
1.使用库函数 arrayOf() 来创建一个数组并传递元素值给它,这样 arrayOf(1, 2, 3) 创建了 array [1, 2, 3]。
val b:Array=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
赋值给Array
,以防止可能的运行时错误。
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=2
val h:Int=3
val str:String="g+h=${g+h}"
转义字符串和原生字符串都支持模板字符串。如果想要在原生字符串中使用$
(它不支持反斜杠转义),可以使用以下语法:
val str:String="""the price is ${'$'}199"""