基础语法
变量
-
Kotlin使用关键字val(value) 以及var(variable)进行变量声明;一个变量除非明确允许被修改,否则应该使用val进行声明,这也是为了解决java中final没有合理使用的问题;
-
Kotlin的类型推导机制,允许在声明变量的时候不对类型进行声明,但需要进行初始化。否则,还是需要声明类型;
-
抛弃了java中的基本数据类型,全部使用对象数据类型
val valInt = 10
var vInt: Int
varInt = 10
函数
- 函数定义语法如下所示:fun声明函数,其后跟函数名、参数、返回值类型、函数体
fun functionName(param1: Int, param2:String ): Int {
return 0
}
- 当函数体只有一行执行代码时,可使用如下语法糖:省略返回类型(可自动推导),省略函数体大括号
fun largerNumber(val num1: Int, val num2: Int) = max(num1, num2)
逻辑控制
- if语句
与java的不同在于if语句返回最后一行代码的返回值,可简化代码
fun largerNumber(num1: Int, num2: Int) = if (num1 > num2) num1 else num2
- when条件语句,类似java的switch语句,省略了冗余,但更强大
可传入任意类型,精确匹配执行逻辑外(匹配值 -> {执行逻辑})
#类似if语句存在返回值,同时可以使用单语句语法糖
fun getScoreByName(val name: String) = when (name) {
"Tom" -> 90
"Jim" -> 87
"Aaron" -> 98
else -> 0
}
when语句运行进行类型匹配
fun checkNum(num: Number) {
when(num){
is Int -> println("number is Int")
is Float -> println("number is Float")
else -> println("not support")
}
}
也具有java的else-if功能;不带参数用法
fun checkNum(num: Number){
when{
num is Int -> println("number is Int")
num is Float -> println("number is Float")
else -> println("not support")
}
}
循环语句
- while与java无异
- for语句使用for-in循环
#循环范围也可传入变量,如val range = 0..10
for(i in 1..5 step 2){}
for(i in 1 until 5){}
for(i in 5 downto 1){}
- for-in 没有for-i灵活,某些特殊场景for-in不满足,可使用while
面向对象
- 类声明,默认不可继承,构造函数在类
- 实例化,不需要关键字new
- 类继承使用":"
- 主构造函数,默认无参主构造函数,自定义主构造参数定义在类名后且无函数体,主构造函数体可写入init(),同时需调用父类构造函数,并在类定义时指定,主构造函数中声明的变量会主动生成该类的成员变量
open class Person(val name: String, val age: Int){}
class Student(name: String, age: Int, val sno: Int) : Person(name, age){
}
- 次构造函数,通过constructor关键字定义,所有次构造函数必须调用主构造函数
class Student(name: String, age: Int, val sno: Int) : Person(name, age){
constructor(name: String) : this(name,19,202011){
}
constructor() : this("",19,202011){
}
}
- 类中自由次构造函数,类定义时遍不需要在定义主构造函数调用的父类构造函数(父类后无括号),同时次类需通过super调用父类构造函数
class Student : Person{
constructor(name: String, age: Int) : super(name,age){
}
}
接口
-
接口在Kotlin中与java一致,在实现接口不使用implements,使用:
-
接口定义的函数可以有默认实现
数据类型与单例类
- 使用data声明数据类,会自动实现equals(),hashCode(),toString()方法减少工作量,无代码还可省略大括号
data class CellPhone(val brand: String, val price: Double)
- 单例类使用object代替class即可实现
object Singleton{
fun test(){}
}
Singleton.test()
Lambda编程
-
lambda就是一小段可以作为参数的代码,函数式API使用lambda作为参数。lambda语法{参数名 1:参数类型, 参数名2: 参数类型 -> 函数体}
-
lambda可简化:lambda参数是最后一个参数,可移动到括号外面;当lambda参数是唯一参数,可省略括号;lambda参数列表只有一个参数,可不必声明参数;
val list = listOf("apple", "pear")
val maxLength = list.maxBy{it.length}
- java的函数式API:当Kotlin中使用java方法,方法接受单抽象方法接口参数,可使用函数式API
Thread{
println("run")
}.start()
kotlin的空指针检查
- Kotlin采用编译判空检查,只有采用?操作符明确声明可空,才允许为空
- 判空辅助工具?.、?:、!!、let
?.变量为空不执行
?:接受左右两个表达式,左边为空返回右边表达式
!!强制说明该变量不为空
let接收一个对象执行let函数内的lambda表达式,常与?.连用
#对象bird,函数fly
bird?.fly()
bird?.let{it.fly()}
kotlin 小技巧
- 支持字符串内嵌表达式
"hello, $name, nice to meet you"
- 可以给函数设置默认参数
#可以通过主构造函数设置默认值,很大程度上代替次构造函数
class Student(val sno: String = "", val grade: Int = 0, name: String = "", age: Int = 0) : Persion(name, age){
}
网友评论