Kotlin的基础类型
与Java相同,Kotlin也是一门强类型语言
- 所有的变量必须先声明后使用
- 指定类型的变量只能接受类型与之匹配的值
标识符规则
Kotlin语言是区分大小写的
- 标识符由 数字、字母、下划线组成,不能以数字开头
- 标识符不能是Kotlin的硬关键字,在特定上下文中不能使用软关键字和修饰符关键字,但可以包含关键字
- 硬关键字:这些关键字无论在什么情况下都不能用作标识符
- 软关键字:这些关键字可以在他们不起作用的上下文中用作标识符
- 标识符不能包含空格
- 标识符只能包含下划线(_)
声明变量
Kotlin要求所有的变量必须先声明、后使用。声明变量时必须显式或隐式指定变量的类型
var|val 变量名:[类型][=初始值]
- var声明的变量是值可变的
- val声明的变量是值不可变的
Kotlin编译器可以根据初始值确定变量的类型,所以声明变量的语法中,变量的类型可以省略。但不能声明变量时既不指定变量类型,也不指定变量初始值
//声明变量时指定类型
var b:Int
//声明变量时指定初始值
var c = "test123"
//显式指定的类型与赋值类型一致,正确
var age = 25
age = 13
//显式指定类型与初始值不一致 错误
var sun: String = 500
//使用val声明的变量是不可变变量,不能重新被赋值
val book = "Kotlin"
book = "kkk"
使用Val声明的不可变变量相当于常量,也就意味着它的值一旦被初始化之后,将不可以被重新赋值
整型
Kotlin提供了4种整型
- Byte:Byte型整数在内存中占8位。兼容Java的byte和Byte类型
- Short:Short型整数在内存中占16位。兼容Java的short和Short类型
- Int:Int型整数在内存中占32位。兼容Java的int和Integer类型
- Long:Long型整数在内存中占64位。兼容Java的long和Long类型
Int型是Kotlin最常用的整数类型,如果声明一个常量或变量时没有指定数据类型,只是简单指定了初始值为整数值,那么Kotlin会自动判断该变量的类型为Int
Kotlin的整型类型与Java不同,Kotlin的整型不是基本类型,而是引用类型(Java的包装类),Byte、Short、Int、Long都继承了Number类型。
程序可通过访问不同整数类型的MIN_VALUE和MAX_VALUE属性来获取对应类型的最大值和最小值
Kotlin是null安全的语言,因此Byte、Short、Int、Long型变量都不能接受null值,如果要存储Null值,则应该使用Byte?、Short?、Int?、Long?类型
Kotlin语言允许在已有的数据类型后面添加"?"来使数据类型可以存储Null值
普通类型的整型变量将会映射成Java的基本类型
带"?"后缀的整型变量将会映射成Java基本的包装类
var pm1 : Int = 200 //java int
var pm2 : Int = 200 //java int
println(pm1===pm2)//类型比较 true
var ob1 : Int?=200 //Java Integer
var ob2 : Int?=200 //Java Integer
println(pm1===pm2) //引用类型比较 false
===:比较引用运算符要求两个变量引用同一个变量,返回true
==: 比较值
Kotlin的整数数值的表示方式
- 十进制
- 二进制 以0b或0B开头的整数数值
- 十六进制:以0x或0X开头的整数数值
Kotlin不支持八进制的整数
浮点型
Kotlin的浮点型有两种
- Float:32位浮点型
- Double:64位双精度浮点型
kotlin的浮点数有两种表示形式
- 十进制数形式:5.12、0.123
- 科学计数:5.12e2、5.12E2
如果声明一个常量或变量时没有指定数据类型,只是指定了其初始值为浮点数,那么Kotlin会自动判断该变量的类型为Double
字符型
字符型值必须使用单引号('')括起来
与Java不同,Kotlin的Char型变量不能当成整数值使用,Char型变量或表达式不能赋值给整型变量,整型变量或表达式也不能赋值给Char变量
val aChar:Char='a'
val enterChar:Char = '\r' //转义字符
val ch:Char = '\u9999' //输出Unicode编码
数值型之间的类型转换
整型之间的类型转换
Kotlin与Java不同,Kotlin不支持取值范围小的数据类型隐式转换为取值范围大的类型
由于不同整型支持的表数范围存在差异,因此进行类型转换时必须注意选择合适的类型
- toByte() 转换为Byte类型
- toShort() 转换为Short类型
- toInt() 转换为Int类型
- toLong() 转换为Long类型
- toFloat() 转换为Float类型
- toDouble() 转换为Double类型
- toChar() 转换为Char类型
不同整型的变量或值之间必须进行显式转换
var bookPrice : Byte = 79
var itemPrice : Short = 120
//类型转换错误
var a :Short = bookPrice
//显式类型转换
var a : Short= bookPrice.toShort()
var b : Byte = itemPrice.toByte()
浮点型与整型之间的转换
浮点型之间需要进行显式转换,浮点型与整型之间也需要进行显式转换
var width: Float = 2.3f
var height: Double = 4.5d
var a : Double = width.toDouble()
//area的类型也被推断为Float
var area = width*height.toFloat()
表达式类型的自动提升
当一个算术表达式包含多个数值型的值时,整个算术表达式的数据类型将发生自动提升。Kotlin定义了与Java基本相似的自动提升规则
- 所有的Byte、Short将被提升成Int类型
- 整个算数表达式的数据类型自动提升到表达式中最高操作等级数同样的类型
Boolean类型
布尔型只有一个Boolean类型,只能是true或false 不能用0或非0来代表
var b1:Boolean = true
var b2 = false
null安全
非空类型和可空类型
var str = "hello"
var num:Int = str.toIntOrNull() //str可能为空 无法通过编译
var num:Int? = str.toIntOrNull() //可以通过编译
对于可能发生值缺失的变量,编译器会自动推断该变量的类型为可空类型
var n = str.toIntOrNull()
只有可空类型的变量或常量才能接受Null,非空类型的变量或常量不能接受Null
Kotlin中如果不加任何处理,可空类型不允许直接调用方法、访问属性。通过可空类型与非空类型的区分,可以避免空指针异常
var aStr = "fkit"
var bStr:String = "fkit"
aStr = null //错误 aStr为非空类型,不接受Null
bStr = null //正确
先判断后使用
可空类型的变量不允许直接调用方法或属性,但可以先判断该变量不为null,然后再调用该变量的方法或属性
var b:String? = "fkit"
var len = if(b!=null) b.length else -1 //先判断后使用
安全调用
安全调用在Java中已经存在,如下面的SpringEL
user?.dog?.name
上面的表达式表示:如果user不为null,则返回user的dog属性,如果dog属性值不为Null,则继续获取dog的name属性值,如果user为null或user.dog为null,整个表达式返回null 并不会NPE
在Kotlin中
var b:String?="fkit"
println(b?.length)// 输出4
b = null
println(b?.length) //输出null
Elvis运算
Elvis运算其实就是if else的简化写法
var b:String?="kit"
var len1 = if(b!=null) b.length else -1
println(len1)
//elvis
var len2=b?.length?:-1
强制调用
Kotlin中使用 “!!.”即可强制调用空变量的方法或属性
var b:String?="fikt"
println(b!!.length)//输出4
字符串
字符串类型
字符串表示一个有序的字符集合
String允许通过s[i]的语法来访问字符串指定索引处的字符,也可以通过for循环遍历字符串中的每一个字符
- 转义字符串:转义字符串可以有转义字符
- 原始字符串:原始字符串可以包含换行和任意文本,原始字符串需要使用3个引号引起来
//普通字符串
var str = "fkit"
//原始字符串
var oriStr = """|aasda
|sdasd
|asdas
|dad"""
Kotlin使用竖线作为边界符,所有竖线之前的内容都会被去掉
字符串模板
Kotlin允许在字符串中嵌入变量或表达式,需要将变量或表达式放入${}中,这样Kotlin将会把该变量或表达式的值嵌入该字符串中
字符串模板不仅可以在普通字符串中使用,也可以在原始字符串中使用
val bookPrice = 79
var s = "图书的价格是${bookPrice}"
Kotlin字符串的方法
Kotlin和Java的String提供的功能大致相似,Kotlin提供了一系列toXxx()将字符串转换成其他数值的方法
val s1 = "2.34"
//转Double
val d:Double = s1.toDouble()
//Int
val i:Int = s1.toInt()
- capitalize() 首字母大写
- Decapitalize() 首字母小写
类型别名
Kotlin可以为已有的类型指定另一个可读性更高的名字,Kotlin提供typealias来定义类型别名
typealias 类型别名 = 已有类型