5.1.3 包与导入

原文链接: https://kotlinlang.org/docs/packages.html

5.1.3 包与导入

在 Kotlin 项目中,代码通过包和导入来组织:

  • 包是一个或多个 Kotlin 文件的容器。文件通过 package 头部与包关联。
  • 导入是一条指令,它让其他包中的实体在当前文件中可用。

包头部

源文件可以以包头部开头:

1
2
3
4
package org.example

fun printMessage() { /*...*/ }
class Message(val text: String) { /*...*/ }

源文件的所有内容(例如类和函数)都属于这个包。它们的完全限定名由包名与实体名称拼接而成。在这个示例中:

  • printMessage() 的完全限定名是 org.example.printMessage。
  • Message 的完全限定名是 org.example.Message。

如果文件没有包头部,它的内容属于根包。

导入

要使用其他包中文件里的实体,请使用 import 指令。除了默认导入之外,每个文件都可以声明自己的导入。

导入单个实体

导入特定实体,这样就可以不加限定地使用它:

1
2
3
4
5
6
7
// Message is accessible without qualification
import org.example.Message

fun main() {
    val message = Message("Hello")
    println(message.text)
}

导入某个作用域的内容

星号导入以星号 * 结尾,会导入相应作用域中的所有具名实体:

1
2
3
4
5
6
7
// Everything in org.example is accessible
import org.example.*

fun main() {
    printMessage()
    val message = Message("Hi")
}

如果你同时用星号导入和显式导入导入了同一个实体,在重载解析时显式导入优先。

用别名解决名称冲突

如果两个被导入的实体同名,请用 as 关键字在本地重命名其中一个:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// Message refers to org.example.Message
import org.example.Message

// TestMessage refers to org.test.Message
import org.test.Message as TestMessage

fun main() {
    val a = Message("from example")
    val b = TestMessage("from test")
}

可以导入哪些内容

import 关键字并不局限于类。无论来自包、类、对象还是枚举,你都可以导入以下实体:

  • 直接声明在包中的顶层函数和属性:
1
2
    import org.example.printMessage // Top-level function
    import org.example.VERSION      // Top-level property
1
2
    import org.example.Config.DEFAULT_TIMEOUT // Property from an object
    import org.example.Config.loadSettings    // Function from an object
1
    import org.example.MyClass.create // Refers to MyClass.Companion.create
1
2
    import org.example.Color.RED
    import org.example.Color.GREEN
  • 嵌套类:
1
    import org.example.Outer.Nested

默认导入

Kotlin 默认包含以下导入:

Kotlin 还会根据目标平台导入额外的包:

可见性与导入

能否导入某个实体取决于它的可见性修饰符:

  • public 实体可以在任何位置导入。
  • internal 实体只能在同一模块内导入。
  • protected 实体不能被导入。
  • 顶层的 private 实体只能在声明它的文件内访问。
  • 其他 private 实体不能被导入。