文章目录
kotlin 是一种在 java 虚拟机上运行的静态类型编程语言。
kotlin 可以编译成 java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。
基本语法
- 包:源文件通常以包声明开头,
package org.example
- 导入:
import org.example.Test
,如果命名冲突,使用关键字as
- 可见性修饰符:
private
、protected
、internal
、public
。默认public。
package org.example
// 程序入口
fun main() {
println("Hello Kotlin!")
}
// 如果指定了主构造函数的可见性,constructor不能省略
class K private constructor(a: Int) {......}
运算符
+
-
*
/
%
- 位运算
数据类型
数值: Byte、Short、Int、Long、Float、Double
字符: Char
布尔: Boolean
数组: Array
字符串: String
类型 | 大小(比特数) | 最小值 | 最大值 |
---|---|---|---|
Byte | 8 | -128 | 127 |
Short | 16 | ||
Int | 32 | ||
Long | 64 | ||
Float 浮点数 | 32 | ||
Double 浮点数 | 64 |
注意
:Kotlin 中的数字没有隐式拓宽转换。例如,具有 Double 参数的函数只能对 Double 值调用,而不能对 Float、Int 或者其他数字值调用。
字面常量
- 十进制:1234
- 十六进制 0x 开头:0xEE
- 二进制 0b 开头:0b0010
- 不支持八进制
类型转换
kotlin 不支持自动类型转换,需要显式调用函数 toLong等。
数字比较
在 kotlin 中,=== 表示比较对象地址,== 表示比较两个值的大小。
变量
val
:只读var
:可变的
val a = 1 // 整数初始化没有指定类型,默认为 Int
val b = 1L // 整数后面跟 L,显式指定 Long 类型
val c = 1.0 // 浮点数初始化没有指定类型,默认为 Double
val d = 1.0F // 浮点数后面跟 f或F,显式指定 Float 类型
// 指定具体类型语法
val e: Byte = 2
数组
// 创建
val array = arrayOf(1, 2, 3)
// 遍历 方式1
for (item in array) {
println(item)
}
// 遍历 方式2
for (i in array.indices) {
println(array[i])
}
// 遍历 方式3
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
// 遍历 方式4
array.forEach { item ->
println(item)
}
字符串
// 字符串模板,$符开头
val n = "kotlin"
println("hello $n")
// ${表达式}
println("hello ${n.length}")
控制流:if、when、for、while
if
if
是一个表达式,即它会返回一个值。if
的分支可以是代码块,最后的表达式作为该块的值。- 如果
if
作为表达式而不是语句,该表达式需要有else
分支。
when
- when 既可以作为语句,也可以当做表达式使用。
- 如果
when
作为表达式,则必须有else
分支。 - 多个分支处理一样时,可以将多个分支条件放到一起,用逗号分隔。
// 可以用任意表达式(而不只是常量)作为分支条件
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
for
// 区间迭代
for (i in 1..3) {
}
while
跳转操作符:
- return
- break
- continue
-----------------------------
函数与Lambda 表达式
- 函数使用
fun
关键字声明 - 参数 使用 Pascal 表示法定义,即
name: type
。参数用逗号隔开,每个参数必须有显式类型,函数参数可以有默认值
name: type =
- 如果函数不返回任何有用的值,它的返回类型是
Unit
。 - 函数作用域 kotlin中函数可以在文件顶层声明,也可以声明在局部作用域、作为成员函数以及扩展函数。
vararg
可变数量的参数。
fun method(param1: Int, param2: Int = 0): Int {
......
}
局部函数
一个函数在另一个函数内部。
成员函数
- 成员函数是在类或对象内部定义的函数。
- 成员函数以点表示法调用。
class C {
fun m() {}
}
C().m()
泛型函数
函数名前使用尖括号指定。
类与对象
kotlin 没有 new
关键字。
构造函数
- kotlin 中的一个类可以有一个主构造函数以及一个或多个次构造函数。
主构造函数
- 主构造函数是类头的一部分:跟在类名(与可选的类型参数)后。
- 主构造函数不能包含任何的代码。初始化的代码可以放到以
init
关键字作为前缀的初始化块(initializer
blocks)中。 - 如果主构造函数没有任何注解或者可⻅性修饰符,可以省略这个
constructor
关键字。
// 主构造函数语法
class Person constructor(firstName: String) { /*......*/ }
class Person(firstName: String) { /*......*/ }
class Person(val name: String) {
var children: MutableList<Person> = mutableListOf() constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
泛型
抽象类
abstract
数据类与密封类
kotlin 可以创建一个只包含数据的类,关键字为 data
:
data class User(val name: String, val age: Int)
密封类⽤来表⽰受限的类继承结构:当⼀个值为有限⼏种的类型、⽽不能有任何其他类型时。关键字为 sealed
嵌套类与内部类
枚举类
内联类
继承
- kotlin中所有类都有一个共同的超类
Any
。 - 默认情况下,类是final:不能被继承。要使一个类可继承,请用
open
关键字标记。 - 方法可覆盖时,需要添加 open
open class Parent {
open fun sum() {...}
}
class Child : Parent() {
override fun sum() {
super.sum()
}
}
接口
interface ITest {
fun test()
}
class C : ITest {
override fun test() {
// 方法体
}
}
函数式(SAM)接口
- 只有一个抽象方法的接口称为函数式接口或 SAM(单一抽象方法)接口。
- 函数式接口可以有多个非抽象成员,但只能有一个抽象成员。
扩展
集合
协程
kotlin 1.3 引入协程。
-----------------------------
附录
修饰符 | 说明 |
---|---|
final | 不能被覆写 |
open | 可以被覆写 |
abstract | 抽象 |
override | 覆盖父类方法 |
const |
关键字 | 说明 |
---|---|
is | 检测值是否特定类型 |
in | 检测值是否在集合中 |
in .. | 检测值是否在区间中 |
版本发布
1.5.0 (2021-05-05)
1.4.20(2020-11-23)
1.4.10(2020-09-07)
1.4.0 (2020-08-17)
- 接口的 SAM (Single Abstract Method) 转换
- 显式 API 模式
- 新的编译器
- 尾后逗号,方便修改
1.3.72(2020-04-15)
1.3.0 (2018-10-30)
- 协程
1.0.0 (2016-2-15)