Skip to content
Merged
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 109 additions & 41 deletions docs/topics/packages.md
Original file line number Diff line number Diff line change
@@ -1,73 +1,141 @@
[//]: # (title: Packages and imports)

A source file may start with a package declaration:
In a Kotlin project, code is organized using packages and imports:

* A **package** is a container for one or more Kotlin files. Files are linked to a package using a `package` header.
* An **import** is a directive that makes entities from other packages available in the current file.
Comment thread
ElviraMustafina marked this conversation as resolved.

## Package headers

A source file may start with a package header:

```kotlin
package org.example

fun printMessage() { /*...*/ }
class Message { /*...*/ }

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

All the contents, such as classes and functions, of the source file are included in this package.
So, in the example above, the full name of `printMessage()` is `org.example.printMessage`,
and the full name of `Message` is `org.example.Message`.
All contents of the source file, such as classes and functions, belong to this package.
Their fully qualified name combines the package name with the entity's name.
In this example:

If the package is not specified, the contents of such a file belong to the _default_ package with no name.
* The fully qualified name of `printMessage()` is `org.example.printMessage`.
Comment thread
ElviraMustafina marked this conversation as resolved.
* The fully qualified name of `Message` is `org.example.Message`.

## Default imports
If a file has no package header, its contents belong to the root package.

A number of packages are imported into every Kotlin file by default:
## Imports

- [kotlin.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/index.html)
- [kotlin.annotation.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.annotation/index.html)
- [kotlin.collections.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/index.html)
- [kotlin.comparisons.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.comparisons/index.html)
- [kotlin.io.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/index.html)
- [kotlin.ranges.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.ranges/index.html)
- [kotlin.sequences.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/index.html)
- [kotlin.text.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/index.html)
To use an entity from a file in a different package, use an `import` directive.
Comment thread
ElviraMustafina marked this conversation as resolved.
In addition to the default imports, each file may declare its own imports.

Additional packages are imported depending on the target platform:
### Import a single entity

- JVM:
- java.lang.*
- [kotlin.jvm.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/index.html)
Import a specific entity so you can use it without qualification:

- JS:
- [kotlin.js.*](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.js/index.html)
```kotlin
// Message is accessible without qualification
import org.example.Message

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

Apart from the default imports, each file may contain its own `import` directives.
### Import the contents of a scope

You can import either a single name:
Star imports, ending in an asterisk `*`, import all named entities inside the corresponding scope:

```kotlin
import org.example.Message // Message is now accessible without qualification
// Everything in `org.example` is accessible
import org.example.*

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

or all the accessible contents of a scope: package, class, object, and so on:
If you import an entity with both a star import and an explicit import,
the explicit import takes priority during overload resolution.

```kotlin
import org.example.* // everything in 'org.example' becomes accessible
```
### Resolve name clashes with aliases

If there is a name clash, you can disambiguate by using `as` keyword to locally rename the clashing entity:
If two imported entities have the same name, use the `as` keyword to locally rename one of them:

```kotlin
import org.example.Message // Message is accessible
import org.test.Message as TestMessage // TestMessage stands for 'org.test.Message'
// Message refers to `org.example.Message`
import org.example.Message

// TestMessage refers to `org.test.Message`
Comment thread
ElviraMustafina marked this conversation as resolved.
Outdated
import org.test.Message as TestMessage

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

The `import` keyword is not restricted to importing classes; you can also use it to import other declarations:
### What you can import

The `import` keyword is not limited to classes. You can import any of the following entities,
whether they come from a package, a class, an object, or an enum:

* Top-level functions and properties declared directly inside a package:
```kotlin
import org.example.printMessage // Top-level function
import org.example.VERSION // Top-level property
```
* Functions and properties from [object declarations](object-declarations.md#object-declarations-overview):
```kotlin
import org.example.Config.DEFAULT_TIMEOUT // Property from an object
import org.example.Config.loadSettings // Function from an object
```
* Members of a [companion object](object-declarations.md#companion-objects), referenced through the enclosing class name:
```kotlin
import org.example.MyClass.create // Refers to `MyClass.Companion.create`
```
* [Enum constants](enum-classes.md):
```kotlin
import org.example.Color.RED
import org.example.Color.GREEN
```
* Nested classes:
```kotlin
import org.example.Outer.Nested
```

## Default imports

Kotlin includes the following imports by default:

* [kotlin.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/index.html)
* [kotlin.annotation.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.annotation/index.html)
* [kotlin.collections.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.collections/index.html)
* [kotlin.comparisons.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.comparisons/index.html)
* [kotlin.io.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.io/index.html)
* [kotlin.ranges.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.ranges/index.html)
* [kotlin.sequences.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.sequences/index.html)
* [kotlin.text.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.text/index.html)
* [kotlin.math.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.math/index.html)

Kotlin imports additional packages depending on the target platform:

* JVM:
* [java.lang.*](https://docs.oracle.com/javase/8/docs/api/java/lang/package-summary.html)
* [kotlin.jvm.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.jvm/index.html)

* JS:
* [kotlin.js.*](https://kotlinlang.org/api/core/kotlin-stdlib/kotlin.js/index.html)

* top-level functions and properties
* functions and properties declared in [object declarations](object-declarations.md#object-declarations-overview)
* [enum constants](enum-classes.md)
## Visibility and imports

## Visibility of top-level declarations
The ability to import an entity depends on its [visibility modifiers](visibility-modifiers.md):

If a top-level declaration is marked `private`, it is private to the file it's declared in (see [Visibility modifiers](visibility-modifiers.md)).
* `public` entities can be imported anywhere.
Comment thread
ElviraMustafina marked this conversation as resolved.
* `internal` entities can be imported only within the same module.
* `protected` entities cannot be imported.
* Top-level `private` entities are only accessible within their declaring file.
* Other `private` entities cannot be imported.
Loading