附录
A.3 常见问题解答(FAQ)
1. Kotlin 与 Java 的主要区别是什么?
- 空安全:Kotlin 默认变量不可为空,需显式声明可空类型(
?)。 - 扩展函数:Kotlin 允许为现有类添加新函数,无需继承。
- 数据类:通过
data class自动生成equals()、hashCode()等方法。 - 函数式编程支持:Lambda 表达式、高阶函数等特性更简洁。
2. 为什么 Kotlin 的 val 和 var 不同?
val:声明不可变变量(类似 Java 的final),赋值后不可修改。var:声明可变变量,允许重新赋值。
3. 如何处理 Kotlin 中的空指针异常?
- 使用安全调用操作符
?.:obj?.method()在obj为null时返回null。 - Elvis 操作符
?::提供默认值,如val name = nullableName ?: "Unknown"。 - 非空断言
!!:强制调用可能为null的对象(需谨慎使用)。
4. Kotlin 协程与线程的区别?
- 轻量级:协程的切换成本远低于线程,可同时启动数万个协程。
- 结构化并发:通过作用域(
CoroutineScope)管理生命周期,避免泄漏。 - 挂起而非阻塞:协程通过
suspend函数挂起,不阻塞线程。
5. 如何在 Kotlin 中实现单例模式?
- 使用
object关键字:调用方式:object Singleton { fun doSomething() { ... } }Singleton.doSomething()。
6. Kotlin 的 lateinit 和 by lazy 有何不同?
lateinit:用于延迟初始化非空变量(必须是var),需在访问前赋值。lateinit var name: Stringby lazy:惰性初始化(首次访问时计算),必须是val。val name: String by lazy { "Kotlin" }
7. 如何将 Java 代码转换为 Kotlin?
- IntelliJ IDEA 自动转换:右键 Java 文件 → "Convert Java File to Kotlin File"。
- 手动调整:需处理 Java 的
null安全性、getter/setter简化等。
8. Kotlin 是否支持多继承?
- 不支持类的多继承,但可通过 接口(
interface)和 委托(by)模拟:class Derived(b: Base) : Base by b, InterfaceA, InterfaceB
9. 如何调试 Kotlin 协程?
- 日志工具:使用
CoroutineName上下文命名协程。 - IDE 支持:IntelliJ IDEA 提供协程调试视图,可查看挂起状态和调用栈。
10. Kotlin 多平台(KMP)的兼容性如何?
- 共享代码:通过
commonMain模块编写跨平台逻辑。 - 平台差异:使用
expect/actual声明平台特定实现。 - 支持平台:Android、iOS、Web、桌面(JVM、Native)等。
提示:更多问题可参考 Kotlin 官方文档 或社区论坛(如 Stack Overflow)。
