包对于模块化是非常重要的,Kotlin的包与Java的定义/语法类似,但是限制完全不同。
一个源文件的包定义应该放在代码开始处:
package foo.bar
fun baz() {}
class Goo {}
// ...
所有的内容被包含在此包的定义下面,在上面的例子中,baz()的全名是foo.bar.bax,Goo的全名是foo.bar.Goo。如果没有指定包名,那么些文件的代码属于默认没有名字的包。
默认引入
有一些包被默认引入到每一个源文件中,不需要再另外显示的引入:
- kotlin.*
- kotlin.annotation.*
- kotlin.collections.*
- kotlin.comparisons.* (从1.1开始)
- kotlin.io.*
- kotlin.ranges.*
- kotlin.sequences.*
- kotlin.text.*
根据不同的平台还会默认引入其他的包:
- JVM:
- java.lang.*
- kotlin.jvm.*
- JS:
- kotlin.js.*
引入 (Imports)
除了默认引入的一些包以外,每个文件应该包含自己的引入指令。
可以引入一个单独的名称,如:
import foo.Bar // Bar可以直接使用,而不需要前面的前缀foo
或者一个包下面的所有内容(包,类,对象等等):
import foo.* // foo下面的所有内容都可以直接访问
如果有名称冲突了,可以使用as关键字在文件范围内重命名来消除冲突:
import foo.Bar // Bar可以直接访问
import bar.Bar as bBar // 使用bBar代替'bar.Bar'
关键字import不局限于引入类,还可以引入其他的定义/声明:
- 顶层(包级别)的函数和属性
- 单例对象内定义的方法和属性
- 枚举常量
跟Java不同的一点是,Kotlin没有import static语法,所有的定义都是通过import关键字实现
顶层定义可见性
如果声明/定义被标记为了private,那么这个声明/定义仅仅对当前文件可见,其他包不能引用。