首先申明下,本文为笔者学习《Kotlin 程序开发入门精要》的笔记,并加入笔者自己的理解和归纳总结。
1. 定义变量和方法
1.1 定义变量
- 定义变量必须以
var
开头,定义常量以val
开头 - 数据类型在变量后面,并且用冒号
(:)
分隔 - 定义变量时如果未初始化,必须指定数据类型。如果进行了初始化,可以不指定数据类型,编译器会自动推导数据类型
- 不需要以分号
(;)
结尾
示例
var a1: Int
var a2: Long = 3
val a3 = 10
1.2 定义方法
- 定义方法以
fun
开头 - 参数需要包括参数名和参数类型
- 可以有返回值,如果没有返回
(Unit)
,也可以不返回
示例
fun add(a: Int, b: Int): Int {
return a + b
}
fun add(): Unit {
}
2. 基础数据类型
2.1 数字类型
数据类型 | 占用字节数 |
---|---|
Double | 8 |
Float | 4 |
Long | 8 |
Int | 4 |
Short | 2 |
Byte | 1 |
Kotlin提供了一系列方法用于类型之间的转换
toByte(): Byte
,转换成Byte
类型toShort(): Short
,转换成Short
类型toInt(): Int
,转换成Int
类型toLong(): Long
,转换成Long
类型toFloat(): Float
,转换成Float
类型toDouble(): Double
,转换成Double
类型toChar(): Char
,转换成Char
类型
Kotlin提供了一些特殊表示法
- 表示
Long
类型,在数值后面加L
或l
- 表示
Float
类型,在数值后面加F
或f
- 表示十六进制,在数值前面加
0x
- 表示二进制,在数值前面加
0b
Kotlin提供了下划线(_)
作为数值分隔符,比如12345678
,可以写成12_345_678
。
2.2 字符类型
字符类型用Char
定义,用单引号表示。
var c1: Char
var c2 = 'a'
字符类型不支持直接与数字比较,但可以通过toInt(): Int
方法转换
if (c2.toInt() == 97) {
println(c2)
}
Kotlin也支持反斜杠(\)
转义符
\t
,制表符\b
,退格符\n
,换行符\r
,回车符\'
,单引号\"
,双引号\\
,反斜杠
2.3 布尔类型
布尔类型用Boolean
定义,有两个值true
和false
。有3种操作: 逻辑或(||)
,逻辑与(&&)
,逻辑非(!)
。
2.4 数组
数组使用Array
类表示,包含get
和set
方法(通过操作符重载实现[]
操作)。
- 使用
arrayOf
函数定义存储任意值的数组 - 使用
arrayOfNulls
函数定义指定长度的空数组 - 使用
Array
类的构造器指定数组长度和初始化数据 - 使用
intArrayOf
、doubleArrayOf
等函数定义指定类型的数组
示例
var arr = arrayOf(1, 2, 3, 'a')
println(arr[2]) // 3
arr[2] = 'b'
println(arr[2]) // b
arrayOfNulls<Int>(4)
// 第二个参数是指初始化每个数组元素的值
Array<Int>(4, { i -> i * i })
doubleArrayOf(1.0, 2.0, 3.0)
2.5 字符串
字符串用String
定义,用双引号表示。
var s1: String
var s2 = "Hello World!"
3个引号表示保留原始格式
var s3 = """
This is format String
with space.
"""
字符串模板,在字符串中添加若干个占位符($)
,内容可以在后期指定。
var s4 = "abcd"
println("$s4.length is ${s4.length}") // abcd.length is 4
3. 控制语句
3.1 if语句
if
语句用法
var a = 12
var b = 15
var min: Int
if (a < b) {
min = a
} else {
min = b
}
if
语句可以作为表达式使用,最后一个表达式是返回值
var min = if (a < b) {
a
} else {
b
}
3.2 when语句
when
语句替代了switch
语句
when
语句会寻找第一个满足条件的分支- 如果分支中多于一条语句,要用
{...}
- 满足条件的分支执行后,会自动终止
when
语句的执行,不用加上break
- 用逗号
(,)
分隔多个条件 in
关键字可以确定一个范围,!in
表示不在这个范围内
示例
when(a) {
1 -> println("a == 1")
2,3 -> println("a == 2 or 3")
in (4..10) -> println("a in (4..10)")
else -> {
println("not found")
}
}
when
语句也可以作为表达式使用
var m: Char = when(a) {
1 -> 'a'
2,3 -> 'b'
in (4..10) -> 'c'
else -> {
'd'
}
}
when
中的分支条件不仅可以是常量,还可以是任意表达式
when(a) {
getValue(1) -> println("getValue(1)")
getValue(2) -> println("getValue(2)")
else -> {
println("not found")
}
}
getValue()
是一个函数
fun getValue(v: Int): Int {
return v + 10
}
3.3 for循环
for
循环直接枚举集合中的元素
var arr = intArrayOf(1, 1, 2, 3, 5, 8)
for (item: Int in arr) {
println(item)
}
for (index in arr.indices) {
println("arr[$index] = ${arr[index]}")
}
for ((index, value) in arr.withIndex()) {
println("arr[$index] = $value")
}
输出
1
1
2
3
5
8
arr[0] = 1
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 5
arr[5] = 8
arr[0] = 1
arr[1] = 1
arr[2] = 2
arr[3] = 3
arr[4] = 5
arr[5] = 8
3.4 while和do…while
while
语句同样支持continue
和break
var i: Int = 1
while(i < 10) {
if (i == 6) break
println(i++)
}
do {
if (i == 5) continue
println(i)
} while (--i > 0)
输出
1
2
3
4
5
6
4
3
2
1
4. 包
在Kotlin中,包名和文件所在目录可以不一致。
Tool.kt文件,该文件可以不在tool目录下,
package tool
val HOUR: Int = 60 * 60
fun max(a: Int, b: Int): Int {
return if (a > b) a else b
}
Use.kt文件,和Tool.kt文件在同一目录下,但未指定package
。
fun main(args: Array<String>) {
println(tool.HOUR) // 3600
println(tool.max(12, 13)) // 13
}
可以使用import
导入。
import tool.HOUR
import tool.max
fun main(args: Array<String>) {
println(HOUR)
println(max(12, 13))
}
可以一次导入所有资源。
import tool.*
可以给导入资源起别名。
import tool.HOUR
import tool.max as MAX
fun main(args: Array<String>) {
println(HOUR)
println(MAX(12, 13))
}
kotlin会默认导入一些包。
- kotlin.*
- kotlin.annotation.*
- kotlin.collections.*
- kotlin.comparisons.*
- kotlin.io.*
- kotlin.ranges.*
- kotlin.sequences.*
- kotlin.text.*
JVM默认导入
- java.lang.*
- kotlin.jvm*