Классы
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
}
Функции-члены
Помимо объявления свойств, описывающих характеристики объекта, можно также определить его поведение с помощью функций-членов.
В 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() или воспользоваться функциями вывода (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)
}
Упражнение 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
)
}
Упражнение 3
Чтобы проверить код, вам понадобится генератор, который создает случайных сотрудников. Определите класс RandomEmployeeGenerator с фиксированным списком возможных имен (в теле класса). Задайте классу минимальную и максимальную зарплату (в заголовке класса). В теле класса определите функцию generateEmployee(). Функция main демонстрирует, как использовать этот класс.
- Подсказка 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())
}
© 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