В этом уроке мы будем обсуждать концепции Объектно-Ориентированного Программирования на языке Kotlin. Мы подробно рассмотрим класс Kotlin. Мы также рассмотрим конструкторы Kotlin, модификаторы доступа и абстрактные классы.
Класс Kotlin
Класс – это определенный чертеж, который объединяет функции и свойства. Классы в Kotlin определяются с использованием ключевого слова
class
, за которым следует имя класса. Тело помещается в фигурные скобки.
class FirstClass {
}
Экземпляр класса создается следующим образом:
val firstClass = FirstClass()
var new = FirstClass() //here new is the name of the var.
В отличие от Java, new
не является ключевым словом в Kotlin. Классы по умолчанию являются final в Kotlin. Так что эквивалент вышеописанных определений на Java будет выглядеть примерно так:
public final class FirstClass {
}
Таким образом, по умолчанию классы в Kotlin не могут быть унаследованы. Чтобы сделать класс непоследовательным, нам нужно добавить ключевое слово open
.
open class Me{
}
Аннотация open
позволяет другим классам наследоваться от этого класса.
Пример класса Kotlin
Давайте создадим класс с несколькими функциями и свойством. Посмотрим, как обратиться к функциям и свойствам этого класса. Кроме того, мы рассмотрим, как установить свойства участника.
class User {
var loggedIn: Boolean = false
val cantChangeValue = "Hi"
fun logOn() {
loggedIn = true
}
fun logOff() {
loggedIn = false
}
}
fun main(args: Array<String>) {
val user = User()
println(user.loggedIn) //false
user.logOn()
println(user.loggedIn) //true
user.logOff()
println(user.loggedIn) //false
user.cantChangeValue = "Hey" //won't compile. Can't modify a final variable.
}
Функция main
принадлежит классу Test.kt
. Для доступа к членам и функциям нам нужно использовать оператор точки. Свойство val
нельзя устанавливать снова с использованием оператора точки.
Инициализация Kotlin
Блок инициализации Kotlin определен следующим образом.
class User {
init{
print("Class instance is initialised.")
}
var loggedIn: Boolean = false
val cantChangeValue = "Hi"
fun logOn() {
loggedIn = true
}
fun logOff() {
loggedIn = false
}
}
Код внутри блока init
выполняется первым при создании класса. Блок init
выполняется каждый раз при создании класса с любым видом конструктора, как мы увидим далее. В классе можно написать несколько блоков инициализации. Они будут выполняться последовательно, как показано ниже.
class MultiInit(name: String) {
init {
println("First initializer block that prints ${name}")
}
init {
println("Second initializer block that prints ${name.length}")
}
}
fun main(args: Array) {
var multiInit = MultiInit("Kotlin")
}
//Ниже выводится в консоль журнала.
//Первый блок инициализации, который выводит Kotlin
//Второй блок инициализации, который выводит 6
В классах Kotlin можно выводить свойства уже в самом объявлении, используя функцию also
, как показано ниже.
class MultiInit(name: String) {
val firstProperty = "First property: $name".also(::println)
init {
println("First initializer block that prints ${name}")
}
val secondProperty = "Second property: ${name.length}".also(::println)
init {
println("Second initializer block that prints ${name.length}")
}
}
fun main(args: Array) {
var multiInit = MultiInit("Kotlin")
}
//Ниже выводится.
//Первое свойство: Kotlin
//Первый блок инициализации, который выводит Kotlin
//Второе свойство: 6
//Второй блок инициализации, который выводит 6
Конструктор Kotlin
Конструкторы в Kotlin – это особые функции-члены, используемые для инициализации свойств. Конструкторы в Kotlin написаны и структурированы по-другому по сравнению с Java. По умолчанию у класса есть пустой конструктор, как показано ниже:
class Student {
var name: String
val age : Int
init {
name = "Anupam"
age = 24
}
init {
name = "Anupam Chugh"
//age = 26
}
}
fun main(args: Array) {
val student = Student()
println("${student.name} age is ${student.age}")
student.name = "Your"
//student.age = 26 //не скомпилируется. age - это val
println("${student.name} age is ${student.age}")
}
//На консоли выводится следующее:
//Anupam Chugh age is 24
//Ваш возраст - 24
Основные конструкторы
Основные конструкторы в Kotlin определяются непосредственно в заголовке класса, как показано ниже.
class User(var name: String, var isAdmin: Boolean) {
init {
name = name + " @ JournalDev.com"
println("Author Name is $name. Is Admin? $isAdmin")
}
}
Определение основных конструкторов размещается в заголовке класса. Мы определили типы свойств (val/var) непосредственно в конструкторе. Примечание: Если не указано как var
, по умолчанию аргументы конструктора являются val
.
class User(name: String, isAdmin: Boolean)
В приведенном выше коде и имя, и isAdmin не могут быть переназначены. В качестве альтернативы, мы также можем присвоить аргументы конструктора членовым свойствам в классе, как показано ниже.
class User(name: String, val isAdmin: Boolean) {
var username = name
val _isAdmin = isAdmin
init {
username= username + " @ JournalDev.com"
println("Author Name is $name. Is Admin? $_isAdmin")
}
}
fun main(args: Array) {
var user = User("Anupam",false)
user.isAdmin = true //won't compile since isAdmin is val
user._isAdmin = true //won't compile. Same reason.
user = User("Pankaj",true)
}
//На консоли выводится следующее:
//Имя автора - Anupam. Администратор? false
//Имя автора - Pankaj. Администратор? true
Значения по умолчанию конструктора Kotlin
Кotlin позволяет нам указывать значения по умолчанию в самом конструкторе, как показано ниже.
class User(name: String, var website: String = "JournalDev") {
init {
println("Author $name writes at $website")
}
init {
website = website + ".com"
println("Author $name writes at $website")
}
}
fun main(args: Array) {
var user = User("Anupam","JournalDev")
user = User("Pankaj","JournalDev")
}
//Следующее выводится в консоль:
//Автор Анупам пишет на JournalDev
//Автор Анупам пишет на JournalDev.com
//Автор Панкадж пишет на JournalDev
//Автор Панкадж пишет на JournalDev.com
Вторичные конструкторы
Вторичные конструкторы записываются внутри тела класса, добавляя перед ключевым словом constructor
. Следующий пример демонстрирует это.
class Student {
var name: String
val age : Int
constructor(name: String, age: Int)
{
this.name = name
this.age = age
}
fun printDetails()
{
println("Name is $name and Age is $age")
}
}
fun main(args: Array) {
var student = Student("Anupam", 24)
student.printDetails()
}
//Следующее выводится в консоль:
//Имя - Анупам, Возраст - 24
Наиболее распространенное использование вторичных конструкторов происходит в подклассах, когда вам нужно инициализировать класс разными способами. Если класс содержит первичный конструктор, вторичный конструктор должен ссылаться на него в своем объявлении. Объявление делается с использованием ключевого слова this
.
class Student(var name: String, val age: Int) {
var skill: String
init {
skill = "NA"
}
constructor(name: String, age: Int, skill: String) : this(name, age) {
this.skill = skill
}
fun printDetails() {
if (skill.equals("NA"))
println("Name is $name and Age is $age")
else
println("Name is $name and Age is $age Skill is $skill")
}
}
//Следующее выводится в консоль:
//Имя - Анупам, Возраст - 24
//Имя - Анупам, Возраст - 24 Skill is Kotlin
Блок `init
` используется для инициализации свойства члена `skill
`. Вторичный конструктор делегирует первичному конструктору с использованием `: this
`.
Пользовательские геттеры и сеттеры
До сих пор мы обращались к свойствам в классе и модифицировали их, используя оператор точки на экземпляре класса. Давайте используем синтаксис `set
` и `get
`, чтобы посмотреть, как мы можем настроить доступ.
class Name{
var post: String = "default"
set(value) {if(!post.isNotEmpty()) {
throw IllegalArgumentException(" Enter a valid name")
}
field = value
print(value)
}
}
fun main(args: Array<String>) {
var name = Name()
name.post = "Kotlin Classes"
name.post = ""
name.post = "Kotlin Data Classes Our Next Tutorial"
}
В журнале консоли печатается следующее:
Kotlin Classes
Exception in thread "main" java.lang.IllegalArgumentException: Enter a valid name
at Name.setPost(Test.kt:16)
at TestKt.main(Test.kt:78)
Переменная `field
` в сеттере сохраняет старое значение. Добавим геттер.
class Name{
var post: String = "default"
set(value) {if(!post.isNotEmpty()) {
throw IllegalArgumentException(" Enter a valid name")
}
field = value
}
get() {
return field.capitalize()
}
}
fun main(args: Array) {
var name = Name()
name.post = "kotlin classes"
println(name.post)
name.post = "kotlin data Classes our next Tutorial"
println(name.post)
}
//Выводится следующее:
//Классы Kotlin
//Kotlin data классы наш следующий урок
Метод `capitalize()
` делает первую букву строки заглавной. Примечание: если свойство является `val
`, метод `set
` не скомпилируется.
Модификатор видимости Kotlin
- Public: Любой класс, функция, свойство, интерфейс или объект, имеющий этот модификатор, виден и может быть доступен из любого места.
- Приватный: Класс/функция, определенная с этим модификатором, может быть доступна только в том же файле. Член/свойство в классе/функции с этим модификатором может быть доступно только внутри этого блока.
- Защищенный: Этот модификатор аналогичен приватному, за исключением того, что он позволяет видимость и доступ в подклассах.
- Внутренний: Класс/интерфейс/функция с этим модификатором доступен только в том же модуле.
Модификаторы видимости также применимы к конструкторам. Присваивание модификатора основному конструктору требует указания ключевого слова constructor
наряду с конструктором в заголовке класса.
class Student private constructor (var name: String, val age: Int) {
var skill: String
init {
skill = "NA"
}
constructor(name: String, age: Int, skill: String) : this(name, age) {
this.skill = skill
}
fun printDetails() {
if (skill.equals("NA"))
println("Name is $name and Age is $age")
else
println("Name is $name and Age is $age Skill is $skill")
}
}
fun main(args: Array) {
var student = Student("Anupam",24,"Kotlin")
student.printDetails()
}
//prints
//Имя - Anupam и Возраст - 24 Навык - Kotlin
Приватные конструкторы не могут быть вызваны вне класса. В приведенном выше коде мы можем создать экземпляр класса в другой функции только с использованием вторичного конструктора.
Абстрактный класс Kotlin
Как и в Java, ключевое слово abstract
используется для объявления абстрактных классов в Kotlin. Абстрактный класс не может быть создан напрямую. Однако его можно наследовать подклассами. По умолчанию члены абстрактного класса не являются абстрактными, если не указано обратное.
abstract class Person(name: String) {
init {
println("Abstract Class. init block. Person name is $name")
}
abstract fun displayAge()
}
class Teacher(name: String): Person(name) {
var age : Int
init {
age = 24
}
override fun displayAge() {
println("Non-abstract class displayAge function overridden. Age is $age")
}
}
fun main(args: Array) {
val person = Teacher("Anupam")
person.displayAge()
}
//Следующее выводится в консоли.
//Абстрактный класс. Блок инициализации. Имя человека - Anupam
//Не абстрактный класс. Возраст - 24
Примечание: Абстрактные классы по умолчанию являются open
. Поэтому добавление модификатора open
для разрешения наследования не требуется. Ключевое слово override
используется для переопределения метода в подклассе. В этом учебнике мы рассмотрели основы классов Kotlin. Есть еще много другого, такого как Data Classes, Sealed Classes, Inheritance и т. д. Мы рассмотрим их в предстоящих уроках. Ссылки: Документация Kotlin
Source:
https://www.digitalocean.com/community/tutorials/kotlin-class-constructor