每一种语言都有自己的基本数据类型,Kotlin也有自己的数据类型,类似与Java包括整型 浮点型 布尔类型等。
【变量】
(1)分隔符 Kotlin语言中的分号 花括号({ )} 方扩号( [ ] ) 原点( .)都具有分隔意义。
① 分号与Java语言不同Kotlin不强制要求每条语句必须以分号结尾,如果是一行内写多个独立语句,前面的语句需要用分号表示结束。
代码语言:javascript复制 var nameC:String = "Hello"; var nameA:String = "Kotlin"
② 花括号的作用就是定义一个代码块,一个代码块指的就是“{”与“}”包含的一段代码,代码块在逻辑上是一个整体。在Kotlin语言中,类体部分 枚举 方法体,条件语句中的条件执行体,与循环语句的循环体也都放在代码块中。
(2) 标识符的规则
区分大小写:Myname 与 myname 是两个不同的标识符。 首字符:可以是下划线 _ 或字母,但不能是数字。 除首字符外其他字符,可以是下划线(_)、字母和数字。 硬关键字(Hard Keywords)不能作为标识符,软关键字(Soft Keywords)、修饰符关键字(Modifier Keywords)在它们的适用场景之外可以作为标识符使用。 特定标识符 field 和 it。在 Kotlin 语言中有两个由编译器定义的特定标识符,它们只能在特定场景中使用有特定的作用,而在其他的场景中可以做标识符使用。
(3) 关键字
硬关键字(Hard Keywords),硬关键字在任何情况下都不能作为关键字,具体包括如下关键字, as、as?、break、class、continue、do、else、false、for、fun、if、in、!in、interface、is、!is、null、object、package、return、super、this、throw、true、try、typealias、val、var、when 和 while。
软关键字(Soft Keywords),软关键字是在它适用场景中不能作为标识符,而其他场景中可以作为标识符,具体包括如下关键字, by、catch、constructor、delegate、dynamic、field、file、finally、get、import、init、param、property、receiver、set、setparam 和 where。
修饰符关键字(Modifier Keywords),修饰符关键字是一种特殊的软关键字,它们用来修饰函数、类、接口、参数和属性等内容,在此场景中不能作为标识符。而其他场景中可以作为标识符,具体包括如下关键字,abstract、annotation、companion、const、crossinline、data、enum、external、final、infix、inner、internal、lateinit、noinline、open、operator、out、override、private、protected、public、reified、sealed、suspend、tailrec和vararg。
【数据类型】
(1)基本数据类型的变量声明 kotlin基本数据类型包括整型 长整型 浮点型 双精度 布尔型 字符型 字符串 这几种常见的数据类型,如下表
看起来是不是跟Java差不多,但是在声明变量的时候却与Java不同
代码语言:javascript复制Int i = 0 //java写法
如果采用Java这种规则来书写Kotlin代码,Android Studio肯定在编译的时候就不能通过,正确的Kotlin写法
代码语言:javascript复制var i:Int = 0
Kotlin声明语句是“变量名”:“变量类型”,而不是Java常见的“变量类型 变量名”这种格式,在这里你会惊奇的发现Kotlin与Java正好相反,Kotlin声明完毕无需分号,直接回车即可。(在分隔符中对分号有介绍,这里就不详细的介绍了)
(2)数值型之间的类型转换 与Java一样不同整型的变量能支持的表数范围是不同的,比如Byte类型的变量或常量只能接受-128~127之间的整数, Short类型的变量或常量只能接受-32768 ~ 32767之间的整数,如果数值超出这个范围就会编译报错。 简单来说Kotlin不支持范围小的数据类型隐式转为取值大的类型。在Kotlin中不允许通过Java的前缀表达式来强制转换类型! 如下表
Kotlin要求不同变量或值之间必须进行显式转换,示例如下
代码语言:javascript复制 val origin: Float = 65.0f
origin.toString()
var int: Int
int = origin.toInt()
int.toString()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " origin " 转换值 " int.toString())
var long: Long
long = origin.toLong()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " origin " 转换值 " long.toString())
var float: Float
float = origin.toDouble().toFloat()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " origin " 转换值 " float.toString())
var double: Double
double = origin.toDouble()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " origin " 转换值 " double.toString())
var char: Char
char = origin.toChar()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " origin " 转换值 " char.toString())
var boolean: Boolean
boolean = origin.isNaN()
LogUtil.printLog(LogUtil.E, "XX1", "原始值 " origin " 转换值 " boolean.toString())
截图如下
【字符串】
(1)字符串与基本类型的转换 字符串转为其他类型数据Kotlin与Java方式对比
(2)字符串的常用方法 Kotlin方法基本兼容Java相关的方法,比如查找指定位置的字串indexOf方法,截取某指定位置字串的方法substring,或者替换字串的操作所调用的replace,对于特定的字符分割操作split方法。
Kotlin使用indexOf 与substring查找截取字符串的例子
代码语言:javascript复制 val origin: Float = 165.0f
origin.toString()
var text:String = origin.toString()
if (text.indexOf(".")>0){
text = text.substring(0,text.indexOf("."))
}
split方法的使用,在java中split返回的是Sting数组,但是在Kotlin中split返回的则是Sting类型的队列,List< String >
代码语言:javascript复制 var origin: String = "12345678.90"
var strList: List<String> = origin.split(".")
var strRe: String = ""
for (item in strList) {
strRe = strRe item ","
}
LogUtil.printLog(LogUtil.E, "XX0", strRe)
△ 如果想获取某个位置的字符,如果采用java的方式去实现时却有些繁琐,因为只能调用substring方法去截取字符串的位置
代码语言:javascript复制Sting str = orgin.shubstring(number,number 1);
如果采用Kotlin去实现就方便很多,因为它可以直接通过下标访问字符串所指定的位置
代码语言:javascript复制Sting str = orgin[number].toString()
同时Kotlin也支持字符串变量通过Get的方式来获取指定位置上的字符
代码语言:javascript复制Sting str = orgin.get(number).toString()
(3)字符串模板及其拼接
Kotlin允许字符串中嵌套变量或者表达式,我们只要把变量或者表达式放进${ }中就OK了,这样Kotlin将该变量或表达式的值嵌入到该字符串中
代码语言:javascript复制var Price : Double= 88.0
var s = "图书的价格是:${Price}元"
【数组–暂时先了解】
暂时先了解一下,在【集合】模块中再详细讲解,先有个大概的了解也方便后续的学习
(1)数组变量的声明
在Java中整数数组是这样声明并初始化的
代码语言:javascript复制int[] int_array = new int[]{1,2,3}
其他数据类型的数组声明与之类似,我们只要把这个int 换成long float double 即可,但是在Kotlin中这么玩是不可以的,Kotlin的数组声明
代码语言:javascript复制var int_array:IntArray = intArrayof(1,2,3)
两者相互对比 Kotlin中提供了新的整型数组类型—IntArray,在分配一个常量数组的时候Kotlin没有使用关键字new,而是调用的intArrayOf方法
代码语言:javascript复制 var intArray: IntArray = intArrayOf(1, 2, 3)
var longArray: LongArray = longArrayOf(1, 2, 3)
var floatArray: FloatArray = floatArrayOf(1.0f, 2.0f, 3.0f)
var doubleArray: DoubleArray = doubleArrayOf(1.0, 2.0, 3.0)
var charArray: CharArray = charArrayOf('a', 'b', 'c')
☆ Kotlin数组类型不包括字符数组,而大家所熟悉的Java是允许使用字符串数组的。
代码语言:javascript复制Sting[] sting_array = new Sting[]{"冲","鸭"}
在Kotlin中不存在StingArray的素组类型,因为Sting是一种特殊的基本数据类型,想要在Kotlin中声明字符串数组代码如下
代码语言:javascript复制var string_array:Array<Sting> = arrayOf("冲","呀呀呀")
(2)数组元素的操作
获取数组的长度,Java中.length ,而在Kotlin中所使用的则是.size 对于如何获取指定位置的数组元素,Java通过方括号加下标来获取,比如intarray[0] 获取数组中的第一个元素。在Kotlin中也可以通过下标的方式获取对应的元素,不过Kotlin要比Java多出两个方法 get set,通过get获取元素的值,通过set方法修改元素值,感觉就像在操作ArrayList队列一样
代码语言:javascript复制 var string_array: Array<String> = arrayOf("How", "Are", "You")
var str: String = ""
var i: Int = 0
while (i < string_array.size) {
str = str string_array[i] ","
i
}
LogUtil.printLog(LogUtil.E, "XXX", str)
【Null 安全】
null安全可以说是Kotlin对Java重大改进之一,这样可以避免Java编程时候令人厌烦的NullPointErexception。
(1)非空类型与可空类型
代码语言:javascript复制 var str:String = ""
var num :Int = str.toIntOrNull()
var num :Int? = str.toIntOrNull()
第二行代码中的num类型为Int,第三行代码num类型为Int? 。程序执行第二行代码无法编译,而第三行代码能通过编译。其中Int?就是一个可空类型,这种类型可以接受Int值和null;而Int类型只能接收Int值不能接受null。 ☆ 只有可空的变量或常量才能接受null,非空类型的变量或常量不能接受null
代码语言:javascript复制 var aStr: String = "kit"
var bStr: String? = "kitt"
aStr = null //错误 aStr 不接受null
bStr = null //正确
//编译不能通过 不能产生NPE
LogUtil.printLog(LogUtil.E, "XX0", aStr.length)
LogUtil.printLog(LogUtil.E, "XX1", bStr.length)
放到IDE中直接标红,没办法编译,更不能产生NullPointErexception了
(2)先判断后使用
可空类型的变量不允许直接调用方法或者属性,但是可以先判断该变量不为null,然后再调用该变量的方法或者属性。
代码语言:javascript复制 var aStr: String? = "kit"
//先判断aStr不为null,然后再访问aStr的属性
var len = if (aStr != null) aStr.length else -1
//输出aStr的长度
LogUtil.printLog(LogUtil.E, "XX0", "aStr的长度为$len")
aStr = null
if (aStr != null && aStr.length > 0){
LogUtil.printLog(LogUtil.E, "XX0", "aStr的长度为${aStr.length}")
}else{
LogUtil.printLog(LogUtil.E, "XX0", "字符串为null")
}
(3)安全调用
Kotlin的安全调用如下
代码语言:javascript复制 var b: String? = "kit"
print(b?.length) //输出3
b = null
print(b?.length) //输出null
即使是 b=null ,也不会引起NullPointErexception,而是返回null Kotlin安全调用也完全支持链式调用
代码语言:javascript复制user?.dog?.name
表示获取user dog name 的属性,如果user 或者user.dog 为null 整个表达式返回为null
(4)Elvis运算
Elvis运算也算是一种小技巧,其实也就是if else的简化
代码语言:javascript复制 //先判断b不为null,然后访问 b的lenght属性
if (b != null) b.length else -1
//使用Elvis运算
var len2 = b?.length?:-1
Elvis的含义如果“?:”左边表达式不为null返回左边表达式的值,否则返回“?:” 右面表达式的值
小结
通过这次学习应该要掌握的技能 (1) 学会Kotlin对数据类型的变量定义以及变量之间的相互转换 (2) 学会Kotlin对字符串的一些操作 (3) 了解Kotlin一些关键字,以及标识符的规则 (4) 了解各种类型数组的声明方式以及数组变量常用的方法 (5) 对Kotlin Null 有一定的了解