1.kotlin变量
①可变变量:var 关键字
var <标识符> : <类型> = <初始化值>
var text : String = "hello world"
②不可变变量:val 关键字,只能赋值一次
val <标识符> : <类型> = <初始化值>
val text : String = "hello world"
无论是变量还是常量都可以没有初始化值,但是需要注意的是,在声明的变量或者常量作为类里面的全局使用的时候必须进行初始化操作,否则会报错,而在函数里面则非必需。
在Java中,声明变量或者常量需要显性的告知所归属的类型,而在kotlin中则无需显示,可交给编译器进行判断。
var x = 5 // 系统自动推断变量类型为Int
③const关键字
在Kotlin中通过val定义的变量,只有get方法,没有set方法,所以只能读不能写。但是其get方法可以复写,从而造成val定义的变量,有可能会发生值变化。针对这个问题,需要采用const关键字。在Kotlin中除了val关键字定义一个常量外,还提供了一个const关键字标识一个常量。const修饰的val变量相当于java中static final是真正意义上的java常量。但是在实际编码中无法直接使用const val,而必须得这样写:
//companion object类似于Java的static
companion object {
const val C : Int = 0
}
2.函数
函数定义使用关键字fun。
①有返回值的函数
fun sum(a: Int, b: Int): Int { // Int 参数,返回值 Int
return a + b
}
// public 方法则必须明确写出返回类型
public fun sum(a: Int, b: Int): Int = a + b
②无返回值的函数
// Unit的可以不写,系统默认的就是Unit
fun printSum(a: Int, b: Int): Unit {
print(a + b)
}
③可变长参数函数 vararg
fun vars(vararg v:Int){
for(vt in v){
print(vt)
}
}
// 测试
fun main(args: Array<String>) {
vars(1,2,3,4,5) // 输出12345
}
④匿名函数
fun main(args: Array<String>) {
val sumLambda: (Int, Int) -> Int = {x,y -> x+y}
println(sumLambda(1,2)) // 输出 3
}
3.NULL检查机制
kotlin的空安全设计对于声明可为空的参数,在使用时候要进行空判断处理,处理的方式有两种:
(1)字段后加!!像Java一样抛出异常。
(2)字段后加?在值为空的时候不做处理直接返回null或者配合?:做空判断处理。
var age: String? = "23" //类型后面加?表示可为空
val ages = age!!.toInt() //抛出空指针异常
val ages1 = age?.toInt() //不做处理返回null
val ages2 = age?.toInt() ?: -1 //age为空返回-1
4.类型检测及自动类型转换
可以使用is运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// 做过类型判断以后,obj会被系统自动转换为String类型
return obj.length
}
}
5.区间
区间表达式由具有操作符形式 .. 的rangeTo函数辅以 in 和 !in 形成。
for (i in 1..4) print(i) // 输出“1234”
for (i in 4..1) print(i) // 什么都不输出,因为在使用in的时候必须保证前面的数字小于后面的数字
if (i in 1..10) { // 等同于 1 <= i && i <= 10
println(i)
}
// 使用 step 指定步长
for (i in 1..4 step 2) print(i) // 输出“13”
for (i in 4 downTo 1 step 2) print(i) // 输出“42”
// 使用until函数排除结束元素
for (i in 1 until 10) { // i in [1, 10) 排除了 10
println(i)
}
注意:使用 ../downTo既包括前又包括后,使用until只包括前不包括后。
6.基本数据类型
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,值相等
}
7.位操作符
对于Int和Long类型,还有一系列的位操作符可以使用,分别是:
shl(bits) – 左移位 (Java’s <<)
shr(bits) – 右移位 (Java’s >>)
ushr(bits) – 无符号右移位 (Java’s >>>)
and(bits) – 与
or(bits) – 或
xor(bits) – 异或
inv() – 反向