【笔记】Kotlin学习笔记

前言

Kotlin是一种在Java虚拟机上执行的静态型别程式语言,它也可以被编译成为JavaScript原始码。(维基百科

编译器

下载依赖

1
brew install kotlin

查看版本

1
kotlinc -version

编译并生成字节码文件

Main.kt:Kotlin源码
Main.jar:Java可执行文件

1
kotlinc Main.kt -include-runtime -d Main.jar

主函数

Main.kt
1
2
3
fun main(args: Array<String>) {
...
}

注释

1
// 单行注释
1
/* 多行注释 */
1
2
3
/**
* 文档注释
*/

语句分隔符

  • 每行代码末尾无需使用;
1
2
语句
语句
  • 多行代码写作一行时,语句与语句之间必须使用;作为语句分隔符
1
语句;语句

输出语句

1
println("文本内容")

输入语句

1
var 变量名: String = readln()

变量

声明变量

1
var 变量名: 数据类型

定义变量

1
var 变量名: 数据类型 = 值

自动类型推导

1
var 变量名 = 值

变量赋值

1
变量名 = 值

常量

定义常量

1
val 变量名: 数据类型 = 值

数据类型

类型 描述 取值范围 值表示方法
UByte 无符号8位整数 0~255 0u
UShort 无符号16位整数 0~65535 0u
UInt 无符号32位整数 0~4294967295 0u
ULong 无符号64位整数 0~18446744073709551615 0u0uL
Byte 有符号8位整数 -128~127 0
Short 有符号16位整数 -32768~32767 0
Int 有符号32位整数 -2147483648~2147483647 0
Long 有符号64位整数 -9223372036854775808~9223372036854775807 0L
Float 32位浮点型数 0.0F
Double 64位浮点型数 0.0
Boolean 布尔型 truefalse
Char 字符型 ''
String 字符串型 ""
Array 数组 IntArrayDoubleArrayArray<?>
1
2
3
4
5
6
7
8
9
10
11
12
13
var a: Byte = 0

var b: Short = 0

var c: Int = 0

var d: Long = 0L

var e: ULong = 0uL

var f: Float = 0.0f

var g: Double = 0.0

进制表示

  • 描述二进制的数值,需要以0b开头
1
var binary = 0b1
  • 在Kotlin语言中不能直接表示八进制数据

  • 描述十六进制的数值,需要以0x开头

1
var hexadecimal = 0xF

长数字分隔符

英式数字分隔法

1
var oneBillion = 1_000_000_000

中式数字分隔法

1
var oneBillion = 10_0000_0000

应用于二进制数

1
var binary = 0b0000_0000

应用于十六进制数

1
var hexadecimal = 0xFFFF_FFFFu

区间

闭区间

1
var 变量名: IntRange = 1..10

左闭右开

1
var 变量名: IntRange = 1 until 10

字符串

1
var 变量名: String = ""

原始字符串

  • 原始字符串会保留空白字符、换行符、制表符
  • 原始字符串会忽略字符串中的转义字符
1
2
3
var 变量名 = """
文本内容
"""

模板字符串

1
2
3
var num = 1

println("文本内容$num") // "文本内容1"

模板字符串

  • 模板字符串会将其他变量值插入到字符串中
1
2
3
var num = 1

var 变量名 = "文本内容${num}" // "文本内容1"
  • 如果插入变量左右有空格,可以省略{}
1
2
3
var num = 1

var 变量名 = "文本内容$num" // "文本内容1"

为数据类型定义别名

1
typealias 数据类型别名 = 数据类型

运算符

算术运算符

  • +(正号)、-(负号)
  • +(加号)、-(减号)、*/%
  • ++(自增)、--(自减)

关系运算符

  • ><>=<===!=

逻辑运算符

  • &&||!

赋值运算符

  • =+=-=*=/=%=

按位运算符

  • and(按位与)、or(按位或)、xor(按位异或)、inv(按位取反)、shl(有符号数左移)、shr(有符号数右移)、ushr(无符号数右移)

将1左移1位

1
var 变量名 = 1 shl 1
1
var 变量名 = 1.shl(1)

将1按位取反

1
var 变量名 = 1.inv()

包含运算符

  • in(包含)、!in(不包含)
1
var 变量名 = 1 in 1..10
1
var 变量名 = 1 !in 1..10

分支语句

if语句

1
2
3
if (布尔表达式) {
布尔表达式成立时执行的代码
}
1
2
3
4
5
if (布尔表达式) {
布尔表达式成立时执行的代码
} else {
布尔表达式不成立时执行的代码
}
1
2
3
4
5
6
7
if (布尔表达式1) {
布尔表达式1成立时执行的代码
} else if (布尔表达式2) {
布尔表达式2成立时执行的代码
} else {
以上布尔表达式都不成立时执行的代码
}
1
2
3
4
5
if (布尔表达式1) {
if (布尔表达式2) {
布尔表达式12都成立时执行的代码
}
}
  • Kotlin的if语句可以返回结果,最后一行表达式表示返回值
1
2
3
var 变量名 = if (布尔表达式) {
返回值
}

when语句

  • Kotlin的when语句不具有穿透行为,在每个case语句中,无需使用break跳出when语句
1
2
3
4
5
6
7
8
9
10
11
when (变量名) {
1 -> {
变量值为值1时执行的代码
}
2 -> {
变量值为值2时执行的代码
}
else -> {
变量值不为以上任何值时执行的代码
}
}
  • Kotlin的when语句支持区间匹配
1
2
3
4
5
6
7
8
9
10
11
when (变量名) {
in 范围1 -> {
变量在区间范围1时执行的语句
}
in 范围2 -> {
变量在区间范围2时执行的语句
}
else -> {
变量不在以上任何区间时执行的语句
}
}
  • 当代码块只有一个表达式时,可以省略大括号
1
2
3
4
5
when (变量名) {
1 -> 变量值为值1时执行的代码
2 -> 变量值为值2时执行的代码
else -> 变量值不为以上任何值时执行的代码
}
1
2
3
4
5
when (变量名) {
范围1 -> 变量在区间范围1时执行的语句
范围2 -> 变量在区间范围2时执行的语句
else -> 变量不在以上任何区间时执行的语句
}
  • Kotlin的when语句可以返回结果,最后一行表达式表示返回值
1
2
3
var 变量名 = when (变量名) {
1 -> 返回值
}

循环语句

while语句

1
2
3
while (布尔表达式) {
布尔表达式成立时反复执行的代码
}

do…while语句

1
2
3
do {
布尔表达式成立时反复执行的代码
} while (布尔表达式)

for…in语句

遍历可迭代对象

1
2
3
for (元素 in 可迭代对象) {
...
}

遍历区间

从小到大

1..10:区间

1
2
3
for (变量名 in 1..10) {
...
}

step 1:步长,缺省值为1

1
2
3
for (变量名 in 1..10 step 1) {
...
}
从大到小
1
2
3
for (变量名 in 1 downTo 10) {
...
}
1
2
3
for (变量名 in 1 downTo 10 step 1) {
...
}

break关键字

  • 跳出1级循环
1
2
3
while (true) {
break
}
  • 通过标签跳出多级循环
1
2
3
4
5
outer@ while (true) {
while (true) {
break@outer
}
}

continue跳出当前循环

  • 结束1级循环,开始下一次循环
1
2
3
while (true) {
continue
}
  • 通过指定标签跳出多级循环,开始下一次循环
1
2
3
4
5
outer@ while (true) {
while (true) {
continue@outer
}
}

完成

参考文献

哔哩哔哩——青空の霞光