Kotlin поддерживает объектно-ориентированную парадигму программирования, а это значит, что программу на данном языке можно представить в виде взаимодействующих между собой объектов.
Представлением объекта является класс. Класс фактически представляет определение объекта. А объект является конкретным воплощением класса. Например, у всех есть некоторое представление о машине, например, кузов, четыре колеса, руль и т.д. - некоторый общий набор характеристик, присущих каждой машине. Это представление фактически и является классом. При этом есть разные машины, у которых отличается форма кузова, какие-то другие детали, то есть есть конкретные воплощения этого класса, конкретные объекты или экземпляры класса.
Для определения класса применяется ключевое слово class, после которого идет имя класса. А после имени класса в фигурных скобках определяется тело класса. Если класс не имеет тела, то фигурные скобки можно опустить. Например, определим класс, который представляет человека:
class Person // либо можно так class Person { }
Класс фактически представляет новый тип данных, поэтому мы можем определять переменные этого типа:
fun main() { val tom: Person val bob: Person val alice: Person } class Person
В функции main определены три переменных типа Person. Стоит также отметить, что в отличие от других объектно-ориентированных языков (как C# или Java), функция main в Kotlin не помещается в отдельный класс, а всегда определяется вне какого-либо класса.
Для создания объекта класса необходимо вызвать конструктор данного класса. Конструктор фактически представляет функцию, которая называется по имени класса и которая выполняет инициализацию объекта. По умолчанию для класса компилятор генерирует пустой конструктор, который мы можем использовать:
val tom: Person = Person()
Часть кода после знака равно Person()
как раз и представляет вызов конструктора, который создает объект класса Person. До вызова конструктора
переменная класса не указывает ни на какой объект.
Например, создадим три объекта класса Person:
fun main() { val tom: Person = Person() val bob: Person = Person() val alice: Person = Person() } class Person
Каждый класс может хранить некоторые данные или состояние в виде свойств. Свойства представляют переменные, определенные на уровне класса с ключевыми словами val и var. Если свойство определено с помощью val, то значение такого свойства можно установить только один раз, то есть оно immutable. Если свойство определено с помощью var, то значение этого свойства можно многократно изменять.
Свойство должно быть инициализировано, то есть обязательно должно иметь начальное значение. Например, определим пару свойств:
class Person{ var name: String = "Undefined" var age: Int = 18 }
В данном случае в классе Person, который представляет человека, определены свойства name (имя человека) и age (возраст человека). И эти свойства инициализированы начальными значениями.
Поскольку эти свойства определены с var, то мы можем изменить их начальные значения:
fun main() { val bob: Person = Person() // создаем объект println(bob.name) // Undefined println(bob.age) // 18 bob.name = "Bob" bob.age = 25 println(bob.name) // Bob println(bob.age) // 25 } class Person{ var name: String = "Undefined" var age: Int = 18 }
Для обращения к свойствам используется имя переменной, которая предствляет объект, и после точки указывается имя свойства. Например, получение значения свойства:
val personName : String = bob.name
Установка значения свойства:
bob.name = "Bob"
Класс также может содержать функции. Функции определяют поведение объектов данного класса. Такие функции еще называют member functions или функции-члены класса. Например, определим класс с функциями:
class Person{ var name: String = "Undefined" var age: Int = 18 fun sayHello(){ println("Hello, my name is $name") } fun go(location: String){ println("$name goes to $location") } fun personToString() : String{ return "Name: $name Age: $age" } }
Функции класса определяется также как и обычные функции. В частности, здесь в классе Person определена функция sayHello()
,
которая выводит на консоль строку "Hello" и эмулирует приветствие объекта Person.
Вторая функция - go()
эмулирует движение объекта Person к определенному местоположению. Местоположение передается через параметр location
.
И третья функция personToString()
возвращает информацию о текущем объекте в виде строки.
В функциях, которые определены внутри класса, доступны свойства этого класса. Так, в данном случае в функциях можно обратиться к свойствам name и age, которые определены в классе Person.
Для обращения к функциям класса необходимо использовать имя объекта, после которого идет название функции и в скобках значения для параметров этой функции:
fun main() { val tom = Person() tom.name = "Tom" tom.age = 37 tom.sayHello() tom.go("the shop") println(tom.personToString()) } class Person{ var name: String = "Undefined" var age: Int = 18 fun sayHello(){ println("Hello, my name is $name") } fun go(location: String){ println("$name goes to $location") } fun personToString() : String{ return "Name: $name Age: $age" } }
Консольный вывод программы:
Hello, my name is Tom Tom goes to the shop Name: Tom Age: 37