-
变量以及类型推断
var 是可变变量,val是不可变,仅能一次赋值
-
定义变量
val c:Int = 1 //c为常量 Int类型 值为1 var定义类似
-
大部分情况下,不需要你使用对象类型定义,编译器可以直接推断出它的类型
val a = 1 //自动推断出为Int a = 2 //error var b = 1 b = 2 //true
-
使用is运算符进行类型检测
fun getLength(obj:Any):Int?{ var result = 0 if(obj is String){ println(obj::class) result = obj.length//如果在if分支上成立,将自动转换为String类 型 } return result }
-
字符串与其模板表达式
- 原始字符串(raw string)由三重引号(""")分隔。原始字符串可以包含换行符和任何其他字符
-
流程控制语句
-
流程控制语句就和Java区别不大,语言共性,但是Kotlin还可以有一些简单的写法
1.if 表达式 val max = if (a >b) a else b//对应与java里三元表达式true?1:0 val max = if(a>b){ println("Max is a") a }else{ println("Max is b") b } 2.when 表达式,可以用于任意表达式 fun switch(x:Int){ val s = "123" when (x) { -1,0 -> print("x == -1 or x == 0") 1 -> pritn("x == 1") 2 -> print("x == 2") 8 -> print("x is 8") parseInt(s) -> println("x is 123") else -> print("x is neither 1 or 2") } } 或者 val x = 1 val validNumbers = arrayOf(1,2,3) when (x) { in 1..10 -> print("x is in the range") in validNumbers -> print("x is valid") !in 10..20 -> print("x is outside the range") else -> print("none of the above") } 3.while、break、continue、return和java一样
-
return相对于Java,返回值可以是函数,return可以省略,直接用=代替
1. val sum = fun(a:Int,b:Int) = a+b sum -->>类型是Int型 想要得到结果可以这样写 sum(1,1) 2. val sum = fun(a:Int,b:Int) = {a+b} sum -->>类型是函数 (..,..) -> Kotlin.Int 想要得到结果,调用sum(1,1).invoke()
-
标签
显示标签 fun returnDemo_1(){ val intArray = intArrayOf(1,2,3,4,5) intArray.forEach here@{ if(it == 3) return@here //跳转到lambda表达式标签here@处 } } 隐式标签,与接受该lambda函数同名 fun returnDemo_2(){ val intArray = intArrayOf(1,2,3,4,5) intArray.forEach{ if(it == 3) return@forEach //作用和上面显示一样 } }
throw表达式 ,它的类型是特殊类型:Nothing,与C、Java中的void意思一样,无法当作擦承诺书传递
-
-
语法与标识符
-
修饰符
- 常见的修饰符有public(默认的) internal protected priate suspend tailrec data sealed open lateinit(用于非空的var类型上,lazy用于val类型上)
-
相等与不等
- 引用相等 === ,不等 !==
- 结构相等 == ,不等!=
- a==b 可以写成 a?.equals(b) ?: (b===null)
-
infix 函数自定义中缀操作符
infix fun String.grow(years:Int):String{ return this +"生长了"+years.toString()+"年"//如果写成years+"...."将会报错,这和Int的运算符plus有关,它的参数没有String类型 } "小明" grow 10 -->>小明生长了10年
-
扩展函数
例如我们为String类型扩展一个notEmpty()函数
fun String.notEmpty():Boolean{ return !this.isEmpty( } >>> "".notEmpty() false
-
扩展属性
对于扩展的属性来说,它的行为只能由显示提供的getters/setters定义
val <T> List<T>.lastIndex:Int get() = size -1
-
-
空指针安全
-
Java中NPE是一件很令程序员头疼的事,Kotlin针对这个问题作了改进
var a:String?="abc"//定义一个可空String类型 na = null//如果a定义为 var a:String = "abc",此处将报错 na.length//会提示报错 na?.length//正确写法 安全调用 na!!.length//正确写法 非空断言调用 再比如: val listWithNulls:List<String?> = listOf("A","B",null) listWithNulls.forEach{ it?.let{println(it)} } 输出:A B
-
这一节主要是写Kt的基础,预热,下一节再介绍基本数据类型和类型系统