Первичные конструкторы
Часть раздела Объектно-ориентированное программирование путешествия по Kotlin на Coddy. Урок 3 из 57.
Большинство классов Kotlin получают свои начальные значения в первичном конструкторе, записанном в скобках после имени класса. val или var перед параметром одновременно делает его свойством:
class Book(val title: String, var pages: Int)Внутри main:
val book = Book("Dune", 412)
println(book.title)
book.pages += 8
println(book.pages)Вывод:
Dune
420Параметр без val или var доступен только во время создания экземпляра, например для вычисления свойства. Свойства val нельзя переназначить после создания; свойства var можно:
class Temperature(celsius: Double) {
val fahrenheit = celsius * 9 / 5 + 32
}Внутри main:
val t = Temperature(100.0)
println(t.fahrenheit)Вывод:
212.0Параметры конструктора могут иметь значения по умолчанию и передаваться по имени, поэтому один конструктор охватывает множество способов создания экземпляра:
class Timer(val seconds: Int, val label: String = "timer")Внутри main:
val egg = Timer(300, "egg")
val quick = Timer(30)
val named = Timer(label = "tea", seconds = 180)
println("${egg.label} ${egg.seconds}")
println("${quick.label} ${quick.seconds}")
println("${named.label} ${named.seconds}")Вывод:
egg 300
timer 30
tea 180В теле класса this ссылается на текущий экземпляр. Он нужен, когда параметр метода имеет то же имя, что и свойство:
class Player(var name: String) {
fun rename(name: String) {
this.name = name
}
}Внутри main:
val p = Player("anon")
p.rename("Ada")
println(p.name)Вывод:
AdaЗадание
ЛегкоОбъявите класс Account с первичным конструктором: доступным только для чтения owner и изменяемым balance, значение которого по умолчанию равно 0. Добавьте summary(), который возвращает Ada has 150.
Предоставленный код считывает имя владельца и, если присутствует вторая строка, начальный баланс. Он создаёт счёт с балансом или без него и выводит summary().
Ваш код должен находиться в Account.kt. В Main.kt содержится предоставленный код ввода-вывода, и его нельзя редактировать.
Попробуйте сами
fun main() {
// Предоставленный код ввода/вывода: оставьте его как есть
val input = generateSequence(::readLine).toList()
val account = if (input.size > 1) Account(input[0], input[1].toInt()) else Account(input[0])
println(account.summary())
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПервичные конструкторыБлоки init и валидацияВторичные конструкторыПовторение — читательский билет4Наследование
Открытые классы и подклассыПереопределение членовsuper и конструкторыАбстрактные классыПовторение — каталог сотрудников7Специальные классы
Классы данныхКлассы перечисленийЗапечатанные иерархииequals, hashCode, toStringПовторение — трекер заказов10Паттерны проектирования. Часть 2
Делегирование с помощью byПаттерн декораторПаттерн строительПаттерн состояние2Свойства и инкапсуляция
Пользовательские аксессорыМодификаторы видимостиПриватные сеттерыlazy и lateinitПовторение — банковский счёт5Интерфейсы
Объявление интерфейсовМетоды по умолчаниюМножественные интерфейсыИнтерфейсы как типыПовторение — способы оплаты8Обобщения
Обобщённые функцииОбобщённые классыОграничения типовВариативность с in и outПовторение — очередь с приоритетом11Проект: Управление библиотекой
Книги и читателиВыдача книг3Объекты и компаньоны
Объявления объектовОбъекты-компаньоныКонстанты с constОбъектные выраженияПовторение — билетная касса6Полиморфизм
Динамическая диспетчеризацияПроверка типов и умные приведения типовwhen с типамиФункции-расширенияПовторение — смотритель зоопарка9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Песочница Kotlin