Kotlin 基础笔记
Kotlin 变量和常量
- var 声明变量
- val 声明常量
- 不同的数据类型用不同的容器保存
- kotlin 会通过类型推断自动推断数据类型
- 我们可以用 : (分号)来显示的指定数据类型
常见容器存储范围
- Byte 整数 -128 ~ 127
- Short 整数 -32768 ~ 32767
- Int 整数 -2147483648 ~ 2147483647
- Long 整数 -9223372036854775807 ~ 9223372036854775807
- Float 小数,小数点可精确到6位
- Double 小数,小数点可以精确到15 ~ 16位
- String 字符串,用 “” 双引号引起来的字符串都可以存
命令行交互式编程
命令行工具下载地址:https://kotlinlang.org/docs/tutorials/command-line.html
函数编写规则
fun 函数名(参数名:参数类型):返回类型{
函数体
}
作业
- 请编写函数,函数名为 sayHello,方法返回值是 String 类型,一个参数是 String 类型,名称为 name。
fun sayHello(name: String): String {
return "Hello, $name"
}
- 请编写函数,函数名为 checkAge,方法的返回值是 Boolen 类型,一个参数是整数类型,名称为 age。
fun checkAge(age: Int): Boolean {
return age > 18
}
- 请编写函数,函数名为 saveLog,方法没有返回值,一个参数是整数类型,名称为 logLever。
fun saveLog(logLever: Int) {
Log.d("TAG", "logLever = " + logLever)
}
字符串模板
$
比如上述 sayHello 函数中返回,name 是变量
"Hello, $name"
条件控制 if else
if、else 如果只有一行,if (xx) xx else xx
字符串比较
= 一个等号是赋值
== 两个等号相当于 java 中 equal,用于比较两个变量的值
=== 三个等号相当于 java 中的 ==,用于比较两个变量的引用是否一致
equals 第二个参数表示是否忽略大小写,默认为 false
Kotlin 空值处理
给变量加上 ?号表示变量可为空
when 表达式
比 java 中 switch 好用,更强大方便
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意这个块
print("x is neither 1 nor 2")
}
}
https://www.kotlincn.net/docs/reference/control-flow.html
loop 和 Range
var num = 1 until 100 // [1,100)
var num = 1 .. 100 // [1,100]
step 跳序 a in num step 2
reversed(), 倒序
count(),总数
list 和 map 入门
var lists = listOf("aa", "bb", "cc")
for ((i, e) in lists.withIndex()) {
Log.d("MainActivity", "$i $e")
}
mapOf():该函数返回不可变的Map集合。该函数可接受0个或多个key-value对,这些key-value对将作为Map的元素。
mutableMapOf():该函数返回可变的MutableMap集合。该函数可接受0个或多个key-value对,这些key-value对将作为Map的元素。
hashMapOf():该函数返回可变的HashMap集合。该函数可接受0个或多个key-value对,这些key-value对将作为Map的元素。
linkedMapOf():该函数返回可变的LinkedHashMap集合。该函数可接受0个或多个key-value对,这些key-value对将作为Map的元素。
sortedMapOf():该函数返回可变的TreeMap集合。该函数可接受0个或多个key-value对,这些key-value对将作为Map的元素。
// 创建不可变集合,返回值是Map
var map = mapOf("Java" to 86, "Kotlin" to 92, "Go" to 78)
...
函数和函数式表达式
fun add(x: Int, y: Int): Int = x + y
// 函数表达式写法
var add = { x: Int, y: Int -> x + y }
// 函数声明另外一种写法
var add2: (Int, Int) -> Int = { x, y -> x + y }
默认参数和具名参数
-
fun add(x: Int = 1, y: Int): Int = x + y
-
var result = add(y = 2)
字符串转数字
var c = "16"
var d = 16
c = d.toString()
d = c.toInt()
人机交互
// readLine()返回值是 String?,键盘输入数据,而不用程序定死
var num = readLine()
异常处理
try {
xxx
} catch (e: Exception) {
xxx
} finally {
xxx
}
递归
// 阶乘
fun fact(num: Int): Int {
if (num == 1) {
return 1
} else {
return num * fact(num - 1)
}
}
尾递归优化
// 累加
tailrec fun ollAdd(num: Int, result: Int): Int {
if (num == 0) {
return 1
} else {
return ollAdd(num - 1, result + num)
}
}
继承
open 可被继承
override 重写
抽象
abstract
多态
同种功能,不同的表现形式,一个东西的多种状态。
接口和抽象类
接口是事物的能力
抽象类是事物的本质
interface
委托和代理
委托是把事情托付给别人或别的机构办理
代理是指以他人的名义,在授权范围内进行对被代理人直接发生法律效力的法律行为。代理的产生,可以是受他人委托。
by
单例模式
object
枚举
enum class Week {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
调用:Week.Monday(Monday), Week.Monday.ordinal(0)
印章类
子类类型有限的 class
sealed
sealed class Person {
fun sayHello(){
Log.d("TAG", "Hello")
}
class Man : Person()
class Woman : Person()
}
印章类和枚举区别
- Sealed class 更在意类型
- 枚举更在意数据
image.png