基本语法 1. Kotlin 程序结构 Kotlin 程序的基本结构:
1 2 3 fun main () { println("Hello, World!" ) }
2. 变量与数据类型 Kotlin 使用 val
和 var
定义变量:
**val
**:不可变变量(类似 Java 的 final
)
**var
**:可变变量
1 2 val name: String = "Alice" var age: Int = 25
Kotlin 支持类型推断,可以省略变量类型:
1 2 val name = "Alice" var age = 25
常见数据类型:
整数 :Int
, Long
, Short
, Byte
浮点数 :Double
, Float
字符 :Char
布尔型 :Boolean
字符串 :String
Kotlin 中的数字没有隐式拓宽转换
小数部分与整数部分之间用句点(.
)分隔 对于以小数初始化的变量,编译器会推断为 Double
类型
如需将一个值显式指定为 Float
类型,请添加 f
或 F
后缀。s
3. 条件语句 if-else 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 fun main () { val a = 10 val b = 20 if (a > b) { println("a is greater" ) } else { println("b is greater" ) } val max = if (a > b) a else b println("Max: $max " ) }
when 表达式 类似 Java 的 switch
,但更强大:
1 2 3 4 5 6 7 8 9 fun main () { val x = 3 when (x) { 1 -> println("x is 1" ) 2 , 3 -> println("x is 2 or 3" ) in 4. .10 -> println("x is between 4 and 10" ) else -> println("x is something else" ) } }
4. 循环语句 for 循环 1 2 3 4 5 6 7 8 9 10 11 for (i in 1. .5 ) { println(i) } for (i in 1 until 5 ) { println(i) } for (i in 5 downTo 1 step 2 ) { println(i) }
while 和 do-while 1 2 3 4 5 6 7 8 9 10 var x = 5 while (x > 0 ) { println(x) x-- } do { println(x) x++ } while (x < 5 )
5. 函数 定义函数 1 2 3 4 5 6 7 fun add (a: Int , b: Int ) : Int { return a + b } fun main () { println(add(3 , 5 )) }
单表达式函数 1 fun subtract (a: Int , b: Int ) = a - b
默认参数与命名参数 1 2 3 4 5 6 7 8 fun greet (name: String = "Guest" ) { println("Hello, $name !" ) } fun main () { greet() greet("Alice" ) }
6. 空安全 Kotlin 提供了空安全操作符,避免空指针异常。
可空类型: 1 2 var name: String? = null name = "Kotlin"
安全调用操作符 ?.
1 val length = name?.length
Elvis 操作符 ?:
1 val length = name?.length ?: 0
非空断言 !!
1 val length = name!!.length
7. 字符串模板 1 2 3 val name = "Alice" val age = 25 println("My name is $name and I am $age years old." )
8. 集合 列表(List)
不可变列表 :
1 2 val list = listOf(1 , 2 , 3 )println(list[0 ])
可变列表 :
1 2 3 val mutableList = mutableListOf(1 , 2 , 3 )mutableList.add(4 ) println(mutableList)
映射(Map)
不可变 Map :
1 2 val map = mapOf("key1" to "value1" , "key2" to "value2" )println(map["key1" ])
可变 Map :
1 2 3 val mutableMap = mutableMapOf("key1" to "value1" )mutableMap["key2" ] = "value2" println(mutableMap)
9. 类与对象 定义类 1 2 3 4 5 6 7 8 class Person (val name: String, var age: Int )fun main () { val person = Person("Alice" , 25 ) println(person.name) person.age = 26 println(person.age) }
主构造函数与次构造函数 1 2 3 4 5 6 7 class Person (val name: String) { var age: Int = 0 constructor (name: String, age: Int ) : this (name) { this .age = age } }
10. 扩展函数 扩展函数允许为已有类添加新函数:
1 2 3 4 5 fun String.lastChar () : Char = this [this .length - 1 ]fun main () { println("Kotlin" .lastChar()) }
11. Lambda 表达式 定义 Lambda: 1 2 val sum = { a: Int , b: Int -> a + b }println(sum(3 , 5 ))
在集合中使用: 1 2 3 val list = listOf(1 , 2 , 3 , 4 , 5 )val evenNumbers = list.filter { it % 2 == 0 }println(evenNumbers)
12. 异常处理 1 2 3 4 5 6 7 try { val x = 10 / 0 } catch (e: ArithmeticException) { println("ArithmeticException: ${e.message} " ) } finally { println("Finally block executed" ) }
高级特性 1. 扩展函数与扩展属性 扩展函数允许为现有类添加新功能,而无需修改原代码。
扩展函数 1 2 3 4 5 6 7 8 fun String.isPalindrome () : Boolean { return this == this .reversed() } fun main () { println("radar" .isPalindrome()) println("hello" .isPalindrome()) }
扩展属性 1 2 3 4 5 6 val String.firstChar: Char get () = this [0 ] fun main () { println("Kotlin" .firstChar) }
2. 高阶函数与 Lambda 表达式 高阶函数 高阶函数是以函数作为参数或返回值的函数。
1 2 3 4 5 6 7 8 fun calculate (a: Int , b: Int , operation: (Int , Int ) -> Int ) : Int { return operation(a, b) } fun main () { val sum = calculate(3 , 5 ) { x, y -> x + y } println(sum) }
Lambda 表达式 Lambda 是匿名函数的一种形式。
1 2 val greet = { name: String -> "Hello, $name " }println(greet("Kotlin" ))
3. 内联函数(inline) 内联函数优化了高阶函数的性能,避免了额外的函数调用开销。
1 2 3 4 5 6 7 8 9 10 11 12 inline fun measureTime (action: () -> Unit ) { val start = System.currentTimeMillis() action() val end = System.currentTimeMillis() println("Elapsed time: ${end - start} ms" ) } fun main () { measureTime { Thread.sleep(1000 ) } }
4. 协程(Coroutines) 协程是 Kotlin 用于简化异步任务的工具。
基本用法 需要在项目中添加协程库依赖:
1 implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" )
1 2 3 4 5 6 7 8 9 import kotlinx.coroutines.*fun main () = runBlocking { launch { delay(1000L ) println("World!" ) } println("Hello," ) }
构建器
launch
:启动一个协程,不返回结果。
async
:启动一个协程,并返回结果。1 2 val result = async { compute() }println("Result: ${result.await()} " )
5. 数据类(Data Class) 数据类会自动生成 toString
、equals
、hashCode
和 copy
方法。
1 2 3 4 5 6 7 8 data class User (val name: String, val age: Int )fun main () { val user = User("Alice" , 25 ) println(user) val newUser = user.copy(age = 30 ) println(newUser) }
6. 密封类(Sealed Class) 密封类用于定义受限的类层次结构,通常用于表示状态或事件。
1 2 3 4 5 6 7 8 9 10 11 sealed class Result { data class Success (val data : String) : Result() object Error : Result() } fun handleResult (result: Result ) { when (result) { is Result.Success -> println("Success: ${result.data} " ) Result.Error -> println("Error" ) } }
7. 泛型 基本泛型 1 2 3 4 5 6 7 8 class Box <T >(val value: T)fun main () { val intBox = Box(123 ) val strBox = Box("Hello" ) println(intBox.value) println(strBox.value) }
协变与逆变
协变(out
) :只能生产(读取)类型。
逆变(in
) :只能消费(写入)类型。
1 2 3 4 5 6 7 8 9 class Producer <out T >(val value: T) { fun get () : T = value } class Consumer <in T > { fun consume (value: T ) { println("Consumed: $value " ) } }
8. 对象表达式与单例 对象表达式 对象表达式用于创建匿名类实例。
1 2 3 4 5 val obj = object { val name = "Anonymous" } println(obj.name)
单例模式 使用 object
定义单例:
1 2 3 4 5 6 7 object Singleton { fun greet () = "Hello from Singleton!" } fun main () { println(Singleton.greet()) }
9. 委托 类委托 通过关键字 by
将一个接口的实现委托给另一个类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 interface Printer { fun print () } class DefaultPrinter : Printer { override fun print () = println("Default Printing" ) } class CustomPrinter (printer: Printer) : Printer by printerfun main () { val printer = CustomPrinter(DefaultPrinter()) printer.print() }
属性委托 通过 by
使用委托属性。
1 2 3 4 5 6 7 8 9 import kotlin.properties.Delegatesvar observableValue: String by Delegates.observable("Initial" ) { _, old, new -> println("Value changed from $old to $new " ) } fun main () { observableValue = "Updated" }
10. 类型别名 类型别名可以为复杂的类型定义更简单的名称。
1 2 3 4 typealias StringMap = Map<String, String>val myMap: StringMap = mapOf("key" to "value" )println(myMap)
11. 注解与反射 注解 自定义注解可以用于元数据描述。
1 2 3 4 5 6 @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.RUNTIME) annotation class MyAnnotation (val value: String)@MyAnnotation("Example Class" ) class Example
反射 使用 kotlin.reflect
进行类反射。
1 2 3 4 5 6 7 import kotlin.reflect.full.*fun main () { val kClass = Example::class val annotation = kClass .findAnnotation <MyAnnotation >() println(annotation ?.value) }
12. DSL(领域特定语言) Kotlin 的灵活语法支持创建 DSL。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 fun html (block: Html .() -> Unit ) : Html { val html = Html() html.block() return html } class Html { fun body (block: Body .() -> Unit ) { val body = Body() body.block() } } class Body { fun p (text: String ) { println("<p>$text </p>" ) } } fun main () { html { body { p("Hello, DSL!" ) } } }
输出:
DSL 写法
1 2 3 4 5 person { name = "Alice" age = 25 introduce() }
等价传统写法
如果没有 DSL 语法,代码等价于:
1 2 3 4 val person = Person()person.name = "Alice" person.age = 25 person.introduce()
等价使用 apply
的写法
Kotlin 的 apply
函数提供了类似的能力:
1 2 3 4 5 val person = Person().apply { name = "Alice" age = 25 introduce() }
普通 Lambda 普通的 Lambda 表达式的形式如下:
1 val lambda: (String) -> Unit = { input -> println(input) }
调用时:
在普通 Lambda 中,input
是显式的参数。
带接收者的 Lambda 带接收者的 Lambda 表达式允许使用一个特定类型的对象作为上下文(接收者),在 Lambda 中可以直接访问接收者的成员:
1 val lambdaWithReceiver: String.() -> Unit = { println(this ) }
调用时:
1 "Hello" .lambdaWithReceiver()
在带接收者的 Lambda 中,this
代表接收者对象(此处为String
),可以直接调用其方法或属性。
13. 内联类 内联类(inline class
)是 Kotlin 中一种轻量级的类类型。
1 2 3 4 5 6 7 8 9 10 @JvmInline value class Username (val value: String) fun greet (username: Username ) { println("Hello, ${username.value} " ) } fun main () { greet(Username("KotlinUser" )) }
使用总结
字符串中,$ 类似于转义字符,把符号转为非字符含义,对表达式就用 ${}
Unit 相当于 Void,可省略
Kotlin 和 Java 的区别
1. 语言特性
特性
Kotlin
Java
简洁性
代码更简洁,减少样板代码(boilerplate)。
需要更多样板代码,例如显式声明 getter/setter、空检查等。
空安全(Null Safety)
默认是空安全的,避免空指针异常(NullPointerException),通过 ?
和 !!
标识空值。
没有内置的空安全机制,可能会导致 NullPointerException。
扩展函数
支持扩展函数,可以为现有类添加新功能而无需继承或修改。
不支持扩展函数,必须通过继承或辅助类实现类似功能。
函数式编程
支持函数式编程(Lambda 表达式、内联函数、高阶函数等)。
支持 Lambda 表达式,但功能没有 Kotlin 丰富。
2. 语法层面
特性
Kotlin
Java
变量声明
使用 val
(不可变)和 var
(可变)。
使用显式类型声明,例如 int
或 String
。
类型推断
支持类型推断,编译器自动推断变量类型。
必须显式指定变量的类型。
数据类(Data Classes)
内置 data class
,自动生成 equals()
、hashCode()
和 toString()
方法。
需要手动实现这些方法。
枚举类(Enums)
支持更灵活的枚举类,可以有函数和属性。
支持基本枚举类功能。
3. 平台支持
特性
Kotlin
Java
跨平台开发
支持多平台开发(Kotlin Multiplatform),可用于 Android、iOS、Web 和服务端。
Java 主要用于跨平台的后端开发(如 Java EE)。
兼容性
100% 兼容 Java,可以调用 Java 的库和代码。
不兼容 Kotlin,但可以通过工具使用 Kotlin 编写的类。
4. 开发效率
特性
Kotlin
Java
开发速度
更高,减少样板代码和空指针问题。
代码较冗长,开发效率可能较低。
错误排查
编译时空安全和类型检查减少运行时错误。
空指针错误和类型转换错误通常在运行时发现。
工具支持
JetBrains 提供全面支持(IntelliJ IDEA、Android Studio)。
官方支持强(Eclipse、NetBeans、Android Studio)。
5. 性能
特性
Kotlin
Java
运行时性能
与 Java 类似,编译为 JVM 字节码。
运行性能稳定,Java 虚拟机优化程度高。
编译速度
相对较慢,特别是首次编译。
编译速度较快。
6. 社区和生态
特性
Kotlin
Java
社区支持
成长较快,但社区规模仍不如 Java。
成熟且庞大的开发者社区和库支持。
学习资源
资源和文档较新,可能较少。
丰富的教程和开发资源,历史悠久。
7. 现代特性支持
特性
Kotlin
Java
协程(Coroutines)
内置协程支持,用于简化异步和并发编程。
不支持协程,但可以使用 CompletableFuture
或外部库(如 RxJava)。
默认参数值
支持默认参数值,减少方法重载。
不支持默认参数值,必须通过方法重载实现。
智能类型转换(Smart Cast)
自动识别和转换类型,无需显式强制转换。
必须显式强制转换类型。
适用场景总结:
Kotlin 更适合现代 Android 开发和希望简化代码逻辑的开发者。
Java 更适合传统项目、需要支持旧版环境或已有大量 Java 代码的项目。
参考 Kotlin 学习网站