54 lines
2.9 KiB
Markdown
54 lines
2.9 KiB
Markdown
---
|
||
title: Hello World!
|
||
description: Первая программа на Kotlin, функция main и запуск через kotlinc
|
||
tags:
|
||
- kotlin
|
||
- syntax
|
||
---
|
||
|
||
```kotlin
|
||
fun main() {
|
||
println("Hello World")
|
||
}
|
||
```
|
||
|
||
Файл `Hello.kt`. Имя файла **не связано** с содержимым - можно назвать как угодно.
|
||
|
||
- `fun` - объявление функции
|
||
- `main` - точка входа, может быть без параметров
|
||
- `println` - функция из стандартной библиотеки, не метод класса
|
||
- Точки с запятой не нужны
|
||
|
||
## Точка входа
|
||
Два допустимых варианта:
|
||
```kotlin
|
||
fun main() { } // обычно используют этот
|
||
fun main(args: Array<String>) { } // если нужны аргументы командной строки
|
||
```
|
||
Функция `main` должна быть на верхнем уровне файла (top-level), внутри класса её быть не может.
|
||
|
||
## Запуск
|
||
```bash
|
||
kotlinc Hello.kt -include-runtime -d hello.jar
|
||
java -jar hello.jar
|
||
```
|
||
Или через скриптовый режим, без создания jar:
|
||
```bash
|
||
kotlin Hello.kt
|
||
```
|
||
Подробнее: [kotlinc](../../Инструментарий/kotlinc.md)
|
||
|
||
> [!info] Отличия от Java
|
||
> В Java `main` обязан лежать внутри класса, быть `public static void` и принимать `String[]`, а имя файла должно совпадать с именем публичного класса ([Hello World! в Java](../../../Программирование%20на%20Java/Синтаксис%20и%20типы/Базовый%20синтаксис/Hello%20World!.md)).
|
||
> В Kotlin всё это не требуется: функции живут прямо в файле.
|
||
>
|
||
> На уровне байт-кода класс всё равно появляется - компилятор создаёт `HelloKt` с методом `public static void main(String[])`. Поэтому JVM запускает Kotlin-код без каких-либо адаптеров.
|
||
> Подробнее: [Kotlin в байт-коде](../../Взаимодействие%20с%20Java/Kotlin%20в%20байт-коде.md)
|
||
|
||
> [!warning] Подводные камни
|
||
> - `fun Main()` или `fun start()` скомпилируется, но JVM точку входа не найдёт - имя строго `main`
|
||
> - Если в файле есть `package`, запускать надо с полным именем: `java -cp . com.example.HelloKt`
|
||
> - Две функции `main()` в одном пакете в разных файлах - это нормально, классы-обёртки будут разными (`HelloKt`, `AppKt`)
|
||
|
||
Далее: [Типы данных](Типы%20данных.md)
|