Spec-Zone.ru › Kotlin 2

Классы

Kotlin поддерживает объектно-ориентированное программирование с помощью классов и объектов. Объекты полезны для хранения данных в программе. Классы позволяют объявить набор характеристик объекта. Создавая объекты на основе класса, вы экономите время и силы, поскольку вам не нужно каждый раз объявлять эти характеристики.

Чтобы объявить класс, используйте ключевое слово class:

class Customer

Свойства

Характеристики объекта класса можно объявить в свойствах. Объявить свойства класса можно:

  • В круглых скобках () после имени класса.

class Contact(val id: Int, var email: String)
  • В теле класса, ограниченном фигурными скобками {}.

class Contact(val id: Int, var email: String) {
    val category: String = ""
}

Рекомендуем объявлять свойства доступными только для чтения (val), если их не требуется изменять после создания экземпляра класса.

Можно объявить свойства без val или var в круглых скобках, но после создания экземпляра к этим свойствам нельзя будет обратиться.

  • Содержимое в круглых скобках () называется заголовком класса.

  • При объявлении свойств класса можно использовать запятую в конце.

Как и параметры функции, свойства класса могут иметь значения по умолчанию:

class Contact(val id: Int, var email: String = "example@gmail.com") {
    val category: String = "work"
}

Создание экземпляра

Чтобы создать объект на основе класса, объявите экземпляр класса с помощью конструктора.

По умолчанию Kotlin автоматически создает конструктор с параметрами, объявленными в заголовке класса.

Например:

class Contact(val id: Int, var email: String)

fun main() {
    val contact = Contact(1, "mary@gmail.com")
}

В этом примере:

  • Contact — это класс.

  • contact — экземпляр класса Contact.

  • id и email — это свойства.

  • id и email используются с конструктором по умолчанию для создания contact.

У классов Kotlin может быть несколько конструкторов, в том числе определенных вами. Подробнее об объявлении нескольких конструкторов см. в разделе Конструкторы.

Доступ к свойствам

Чтобы обратиться к свойству экземпляра, укажите имя свойства после имени экземпляра, поставив между ними точку .:

class Contact(val id: Int, var email: String)

fun main() {
    val contact = Contact(1, "mary@gmail.com")
    
    // Prints the value of the property: email
    println(contact.email)           
    // mary@gmail.com

    // Updates the value of the property: email
    contact.email = "jane@gmail.com"
    
    // Prints the new value of the property: email
    println(contact.email)           
    // jane@gmail.com
}

Чтобы включить значение свойства в строку, можно использовать шаблоны строк ($). Например:

println("Their email address is: ${contact.email}")

Функции-члены

Помимо объявления свойств, описывающих характеристики объекта, можно также определить его поведение с помощью функций-членов.

В Kotlin функции-члены должны быть объявлены в теле класса. Чтобы вызвать функцию-член для экземпляра, укажите имя функции после имени экземпляра, поставив между ними точку .. Например:

class Contact(val id: Int, var email: String) {
    fun printId() {
        println(id)
    }
}

fun main() {
    val contact = Contact(1, "mary@gmail.com")
    // Calls member function printId()
    contact.printId()           
    // 1
}

Классы данных

В Kotlin есть классы данных, которые особенно полезны для хранения данных. Классы данных обладают теми же возможностями, что и обычные классы, но автоматически получают дополнительные функции-члены. Эти функции позволяют легко выводить экземпляр в удобочитаемом виде, сравнивать экземпляры класса, копировать экземпляры и выполнять другие операции. Поскольку эти функции доступны автоматически, вам не придется тратить время на написание одинакового шаблонного кода для каждого класса.

Чтобы объявить класс данных, используйте ключевое слово data:

data class User(val name: String, val id: Int)

При создании функций-членов компилятор Kotlin использует только свойства, объявленные в первичном конструкторе. Если объявить свойства в теле класса данных, они не будут включены в вывод сгенерированных функций.

Самые полезные предопределенные функции-члены классов данных:

Функция

Описание

toString()

Выводит экземпляр класса и его свойства в виде удобочитаемой строки.

equals() или ==

Сравнивает экземпляры класса.

copy()

Создает экземпляр класса путем копирования другого экземпляра, при необходимости изменяя некоторые свойства.

Примеры использования каждой функции приведены в следующих разделах:

  • Вывод в виде строки

  • Сравнение экземпляров

  • Копирование экземпляра

Вывод в виде строки

Чтобы вывести экземпляр класса в виде удобочитаемой строки, можно явно вызвать функцию toString() или воспользоваться функциями вывода (println() и print()), которые автоматически вызывают toString():

data class User(val name: String, val id: Int)

fun main() {
    //sampleStart
    val user = User("Alex", 1)
    
    // Automatically uses toString() function so that output is easy to read
    println(user)            
    // User(name=Alex, id=1)
    //sampleEnd
}

Это особенно полезно при отладке и создании журналов.

Сравнение экземпляров

Для сравнения экземпляров классов данных используйте оператор равенства ==:

data class User(val name: String, val id: Int)

fun main() {
    //sampleStart
    val user = User("Alex", 1)
    val secondUser = User("Alex", 1)
    val thirdUser = User("Max", 2)

    // Compares user to second user
    println("user == secondUser: ${user == secondUser}") 
    // user == secondUser: true
    
    // Compares user to third user
    println("user == thirdUser: ${user == thirdUser}")   
    // user == thirdUser: false
    //sampleEnd
}

Копирование экземпляра

Чтобы создать точную копию экземпляра класса данных, вызовите для него функцию copy().

Чтобы создать копию экземпляра класса данных и изменить некоторые свойства, вызовите для экземпляра функцию copy() и укажите новые значения свойств в качестве параметров функции.

Например:

data class User(val name: String, val id: Int)

fun main() {
    //sampleStart
    val user = User("Alex", 1)

    // Creates an exact copy of user
    println(user.copy())       
    // User(name=Alex, id=1)

    // Creates a copy of user with name: "Max"
    println(user.copy("Max"))  
    // User(name=Max, id=1)

    // Creates a copy of user with id: 3
    println(user.copy(id = 3)) 
    // User(name=Alex, id=3)
    //sampleEnd
}

Создать копию экземпляра безопаснее, чем изменять исходный экземпляр, поскольку код, зависящий от исходного экземпляра, не будет затронут копией и вашими действиями с ней.

Дополнительные сведения о классах данных см. в разделе Классы данных.

Последняя глава этого тура посвящена безопасности при работе с null в Kotlin.

Практика

Упражнение 1

Определите класс данных Employee с двумя свойствами: одно для имени, другое для зарплаты. Убедитесь, что свойство зарплаты можно изменять, иначе в конце года вы не получите прибавку! Функция main демонстрирует, как использовать этот класс данных.

// Write your code here

fun main() {
    val emp = Employee("Mary", 20)
    println(emp)
    emp.salary += 10
    println(emp)
}
data class Employee(val name: String, var salary: Int) fun main() { val emp = Employee("Mary", 20) println(emp) emp.salary += 10 println(emp) }

Упражнение 2

Объявите дополнительные классы данных, необходимые для компиляции этого кода.

data class Person(val name: Name, val address: Address, val ownsAPet: Boolean = true)
// Write your code here
// data class Name(...)

fun main() {
    val person = Person(
        Name("John", "Smith"),
        Address("123 Fake Street", City("Springfield", "US")),
        ownsAPet = false
    )
}
data class Person(val name: Name, val address: Address, val ownsAPet: Boolean = true) data class Name(val first: String, val last: String) data class Address(val street: String, val city: City) data class City(val name: String, val countryCode: String) fun main() { val person = Person( Name("John", "Smith"), Address("123 Fake Street", City("Springfield", "US")), ownsAPet = false ) }

Упражнение 3

Чтобы проверить код, вам понадобится генератор, который создает случайных сотрудников. Определите класс RandomEmployeeGenerator с фиксированным списком возможных имен (в теле класса). Задайте классу минимальную и максимальную зарплату (в заголовке класса). В теле класса определите функцию generateEmployee(). Функция main демонстрирует, как использовать этот класс.

В этом упражнении вы импортируете пакет, чтобы использовать функцию Random.nextInt(). Дополнительные сведения об импорте пакетов см. в разделе Пакеты и импорты.

Подсказка 1

У списков есть функция-расширение .random(), которая возвращает случайный элемент списка.

Подсказка 2

Random.nextInt(from = ..., until = ...) возвращает случайное число типа Int в заданном диапазоне.

import kotlin.random.Random

data class Employee(val name: String, var salary: Int)

// Write your code here

fun main() {
    val empGen = RandomEmployeeGenerator(10, 30)
    println(empGen.generateEmployee())
    println(empGen.generateEmployee())
    println(empGen.generateEmployee())
    empGen.minSalary = 50
    empGen.maxSalary = 100
    println(empGen.generateEmployee())
}
import kotlin.random.Random data class Employee(val name: String, var salary: Int) class RandomEmployeeGenerator(var minSalary: Int, var maxSalary: Int) { val names = listOf("John", "Mary", "Ann", "Paul", "Jack", "Elizabeth") fun generateEmployee() = Employee(names.random(), Random.nextInt(from = minSalary, until = maxSalary)) } fun main() { val empGen = RandomEmployeeGenerator(10, 30) println(empGen.generateEmployee()) println(empGen.generateEmployee()) println(empGen.generateEmployee()) empGen.minSalary = 50 empGen.maxSalary = 100 println(empGen.generateEmployee()) }
  • Предыдущий шаг

  • Следующий шаг

01 июля 2026
ФункцииБезопасность при работе с null

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/kotlin-tour-classes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API