一、学习资源
Kotlin在线运行网站
参考:Kotlin Playground: Edit, Run, Share Kotlin Code Online
Kotlin教程
菜鸟教程:Kotlin 教程 | 菜鸟教程
kotlin资源大全:Kotlin 资源大全 - 如何学习 Kotlin? - 知乎
二、主要内容
本文主要介绍Kotlin和Java在语法上的区别之处,类似的地方不做介绍,需要详细了解请参考"学习资源 -> 菜鸟教程"。
2.1 变量
var定义变量、val定义常量,在Kotlin中不声明类型,默认为不可变的变量
2.2 逻辑控制
2.2.1 if语句
1. if语句有返回值,可用于简化代码;
使用实例
(1)获取两个数中的最大值,使用了语法糖(即编程语言中更简洁的表达语法)
fun largeNumber =(num1: Int, num2: Int) = if (num1 > num2) {
num1
} else {
num2
}
(2)通过if判断找出对应学生的分数
//通过if判断找出对应学生的分数
fun getScore(name: String) = if (name == "Tom") {
86
} else if (name == "Jim") {
77
} else if (name == "Jack") {
95
} else if (name == "Lily") {
100
} else {
0
}
2.2.2 when语句
有点类似于Java中的switch语句;
when语句也有返回值;
when的结构:匹配值 -> { 执行逻辑 }
使用实例
(1)通过when语句找出对应学生的分数,可以简化if-else语句;
fun getScore(name: String) = when (name) {//精确匹配
"Tom" -> 86
"Jim" -> 77
"Jack" -> 95
"Lily" -> 100
else -> 0
}
(2)when支持类型匹配;
fun checkNumber(num: Number) {
when (num) {
is Int -> println("number is Int")
is Double -> println("number is Double")
else -> println("number not support")
}
}
(3)until和..关键字,step关键词,downTo关键字
//依次输出:0 1 2 3 4 5 6 7 8 9 10(以换行符分隔)
fun test1() {
for(i in 0..10) {// "0..10"是双端闭区间
println(i)
}
//依次输出:0 2 4 6 8(以换行符分隔)
fun test2() {
for (i in 0 until 10 step 2) {"0 until 10"是左闭右开区间
println(i)
}
}
//依次输出:10 9 8 7 6 5 4 3 2 1(以换行符分隔)
fun test3() {
for (i in 10 downTo 1) {"10 downTo 1"是双端闭区间
println(i)
}
}
2.3 面向对象编程
2.3.1 对象的创建
val p = Person() //区别于Java的是,对类进行实例化时,不需要使用new关键字
2.3.2 类的继承
默认情况下,类是不可以被继承的,类似于变量默认为常量(不可被改变)。
当然,抽象类默认是可以被继承的,因为抽象类本身无法创建实例,一定要子类去继承它。
在class前面加open关键词可以声明该类可以被继承;
让Student类继承Person类:class Student : Person() {}
继承时为什么要加()括号呢?这就涉及到主构造函数和次构造函数
主构造函数和次构造函数
主构造函数将是你最常用的构造函数,主构造函数没有函数体,所有主构造函数中的逻辑放在init结构体中,如下代码:
class Student(val sno: String, val grade: Int) : Person() {
init {
println("sno is " + sno) //学号
println("grade is " + grade) //成绩
}
}
继承
如上代码中,":"后面写的是"Person()",表示继承的是Person类的无参构造函数,若Person定义时没写无参构造函数,则这里会报错;
那Student要是没有Person的name和age属性怎么办?又不能用无参构造函数,就只能采用如下方法:
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) {
...
}
(1)子类继承父类的方法或变量时,需要在fun关键字前面添加override关键字;
2.4 kotlin接口
(1)使用interface关键字定义接口,且允许方法有默认实现;
2.5 kotlin扩展
(1)认真理解:kotlin扩展声明为成员的运行原理;
2.6 kotlin数据类与密封类
(1)认真理解:密封类
2.7 kotlin泛型
(1)定义泛型类时,类型参数写于类名后;定义泛型函数时,类型参数写于函数前;