Учебники

Котлин — Краткое руководство

Котлин — Обзор

Kotlin — это новый язык программирования с открытым исходным кодом, такой как Java, JavaScript и т. Д. Это язык высокого уровня со строго статической типизацией, который объединяет функциональную и техническую часть в одном месте. В настоящее время Kotlin ориентирован на Java и JavaScript. Он работает на JVM.

Kotlin находится под влиянием других языков программирования, таких как Java, Scala, Groovy, Gosu и т. Д. Синтаксис Kotlin может быть не совсем похож на JAVA, однако внутренне Kotlin зависит от существующей библиотеки Java Class для получения замечательных результатов для программистов , Kotlin обеспечивает совместимость, безопасность кода и ясность для разработчиков по всему миру.

Преимущества и недостатки

Ниже приведены некоторые преимущества использования Kotlin для разработки приложений.

Easy Language — Kotlin — это функциональный язык, который очень легко выучить. Синтаксис во многом похож на Java, поэтому его очень легко запомнить. Kotlin более выразителен, что делает ваш код более читабельным и понятным.

Кратко — Kotlin основан на JVM и является функциональным языком. Таким образом, это уменьшает количество кода, используемого в других языках программирования.

Runtime and Performance — Лучшая производительность и небольшая среда выполнения.

Функциональная совместимость — Kotlin достаточно развит, чтобы создавать совместимые приложения менее сложным способом.

Совершенно новый — Kotlin — это новый язык, который дает разработчикам новое начало. Это не замена Java, хотя она разработана на основе JVM. Он принят в качестве первого официального языка разработки Android. Kotlin может быть определен как — Kotlin = JAVA + дополнительные обновленные новые функции.

Ниже приведены некоторые недостатки Kotlin.

Объявление пространства имен — Kotlin позволяет разработчикам объявлять функции на верхнем уровне. Однако всякий раз, когда одна и та же функция объявляется во многих местах вашего приложения, трудно понять, какая функция вызывается.

Отсутствие статического объявления — у Kotlin нет обычного модификатора статической обработки, такого как Java, что может вызвать некоторые проблемы у обычного разработчика Java.

Котлин — Настройка среды

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

Шаг 1 — установка Java 8.

Kotlin работает на JVM, следовательно. действительно необходимо использовать JDK 8 для вашей локальной разработки Kotlin. Пожалуйста, обратитесь к официальному сайту oracle, чтобы загрузить и установить JDK 8 или более позднюю версию. Возможно, вам придется установить переменную окружения для JAVA так, чтобы она могла работать должным образом. Чтобы проверить вашу установку в операционной системе Windows, нажмите «java –version» в командной строке, и в качестве результата вы увидите версию java, установленную в вашей системе.

Шаг 2 — установка IDE.

Есть ряд IDE, доступных через Интернет. Вы можете использовать любой на ваш выбор. Вы можете найти ссылку для загрузки другой IDE в следующей таблице.

Имя IDE Ссылка для установки
NetBeans https://netbeans.org/downloads/
Затмение https://www.eclipse.org/downloads/
Intellij https://www.jetbrains.com/idea/download/#section = windows

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

Шаг 3 — Настройка Eclipse.

Откройте Eclipse и перейдите на «Eclipse Market Place». Вы найдете следующий экран.

Eclipse Market Place

Найдите Kotlin в окне поиска и установите его в своей локальной системе. Это может занять некоторое время в зависимости от скорости интернета. Возможно, вам придется перезапустить Eclipse, как только он будет успешно установлен.

Шаг 4 — Котлинский проект.

После успешного перезапуска Eclipse и установки Kotlin вы сможете создать проект Kotlin на лету. Перейдите в Файл → Создать → Другие и выберите «Проект Kotlin» из списка.

Котлин проект

После завершения настройки проекта вы можете создать файл Kotlin в папке «SRC». Щелкните левой кнопкой мыши на папке «Src» и нажмите «новый». Вы получите опцию для файла Kotlin, в противном случае вам, возможно, придется искать в «других». После создания нового файла каталог вашего проекта будет выглядеть следующим образом.

Привет

Ваша среда разработки готова сейчас. Затем добавьте следующий фрагмент кода в файл «Hello.kt».

Live Demo

fun main(args: Array<String>) {
   println("Hello, World!")
}

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

Hello, World!

Котлин — Архитектура

Kotlin — это язык программирования, имеющий собственную архитектуру для распределения памяти и качественного вывода для конечного пользователя. Ниже приведены различные сценарии, в которых компилятор Kotlin будет работать по-разному, когда он нацелен на другие языки, такие как Java и JavaScript.

Компилятор Kotlin создает байт-код, и этот байт-код может выполняться на JVM, который в точности равен байт-коду, созданному файлом Java .class . Всякий раз, когда в JVM запускается двухбайтовый файл, они могут связываться друг с другом, и именно так в Kotlin for Java устанавливается совместимая функция.

Архитектура

Всякий раз, когда Kotlin предназначается для JavaScript, компилятор Kotlin преобразует файл .kt в ES5.1 и генерирует совместимый код для JavaScript. Компилятор Kotlin способен создавать совместимые с платформой коды через LLVM.

Котлин — Основные типы

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

чисел

Представление чисел в Kotlin очень похоже на Java, однако Kotlin не позволяет внутреннее преобразование различных типов данных. В следующей таблице перечислены разные длины переменных для разных чисел.

Тип Размер
двойной 64
терка 32
Долго 64
Int 32
короткий 16
Байт 8

В следующем примере мы увидим, как Kotlin работает с различными типами данных. Пожалуйста, введите следующий код в нашу базу кодирования.

Live Demo

fun main(args: Array<String>) {
   val a: Int = 10000
   val d: Double = 100.00
   val f: Float = 100.00f
   val l: Long = 1000000004
   val s: Short = 10
   val b: Byte = 1
   
   println("Your Int Value is "+a);
   println("Your Double  Value is "+d);
   println("Your Float Value is "+f);
   println("Your Long Value is "+l);
   println("Your Short Value is "+s);
   println("Your Byte Value is "+b);
}

Когда вы запустите указанный выше фрагмент кода в основании кода, он сгенерирует следующий вывод в веб-консоли.

Your Int Value is 10000
Your Double  Value is 100.0
Your Float Value is 100.0
Your Long Value is 1000000004
Your Short Value is 10
Your Byte Value is 1

Персонажи

Котлин представляет персонажа с помощью символа . Символ должен быть объявлен в одинарной кавычке, например «c» . Пожалуйста, введите следующий код в нашем коде и посмотрите, как Котлин интерпретирует символьную переменную. Символьная переменная не может быть объявлена ​​как числовые переменные. Переменная Kotlin может быть объявлена ​​двумя способами — один с использованием «var», а другой с использованием «val» .

Live Demo

fun main(args: Array<String>) {
   val letter: Char    // defining a variable 
   letter = 'A'        // Assigning a value to it 
   println("$letter")
}

Приведенный выше фрагмент кода выдаст следующий вывод в окне вывода браузера.

A

логический

Boolean очень прост, как и другие языки программирования. У нас есть только два значения для логического значения — либо true, либо false. В следующем примере мы увидим, как Kotlin интерпретирует Boolean.

Live Demo

fun main(args: Array<String>) {
   val letter: Boolean   // defining a variable 
   letter = true         // Assinging a value to it 
   println("Your character value is "+"$letter")
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

Your character value is true

Струны

Строки — это массивы символов. Как и Java, они неизменны по своей природе. У нас есть два типа строк, доступных в Kotlin: один называется raw String, а другой — escape-String . В следующем примере мы будем использовать эти строки.

Live Demo

fun main(args: Array<String>) {
   var rawString :String  = "I am Raw String!"
   val escapedString : String  = "I am escaped String!\n"
   
   println("Hello!"+escapedString)
   println("Hey!!"+rawString)   
}

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

Hello!I am escaped String!

Hey!!I am Raw String!

Массивы

Массивы представляют собой совокупность однородных данных. Как и Java, Kotlin поддерживает массивы разных типов данных. В следующем примере мы будем использовать разные массивы.

Live Demo

fun main(args: Array<String>) {
   val numbers: IntArray = intArrayOf(1, 2, 3, 4, 5)
   println("Hey!! I am array Example"+numbers[2])
}

Приведенный выше фрагмент кода дает следующий вывод. Индексация массива аналогична другим языкам программирования. Здесь мы ищем второй индекс, значение которого равно «3».

Hey!! I am array Example3

Коллекции

Сбор является очень важной частью структуры данных, которая облегчает разработку программного обеспечения для инженеров. Kotlin имеет два типа коллекций — один является неизменяемой коллекцией (что означает списки, карты и наборы, которые нельзя редактировать), а другой — изменяемой коллекцией (этот тип коллекции является редактируемой). Очень важно помнить о типе коллекции, используемой в вашем приложении, поскольку система Kotlin не представляет какой-либо конкретной разницы в них.

Live Demo

fun main(args: Array<String>) { 
   val numbers: MutableList<Int> = mutableListOf(1, 2, 3) //mutable List 
   val readOnlyView: List<Int> = numbers                  // immutable list 
   println("my mutable list--"+numbers)        // prints "[1, 2, 3]" 
   numbers.add(4) 
   println("my mutable list after addition --"+numbers)        // prints "[1, 2, 3, 4]" 
   println(readOnlyView)     
   readOnlyView.clear()    // ⇒ does not compile  
// gives error  
}

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

main.kt:9:18: error: unresolved reference: clear
   readOnlyView.clear()    // -> does not compile  
                 ^

В коллекции Kotlin предоставляет несколько полезных методов, таких как first (), last (), filter () и т. Д. Все эти методы являются наглядными и простыми в реализации. Более того, Kotlin следует той же структуре, что и Java, при реализации коллекции. Вы можете свободно реализовать любую коллекцию по вашему выбору, такую ​​как Карта и Набор.

В следующем примере мы реализовали Map и Set, используя различные встроенные методы.

Live Demo

fun main(args: Array<String>) {
   val items = listOf(1, 2, 3, 4)
   println("First Element of our list----"+items.first())
   println("Last Element of our list----"+items.last())
   println("Even Numbers of our List----"+items.
      filter { it % 2 = = 0 })   // returns [2, 4]
   
   val readWriteMap = hashMapOf("foo" to 1, "bar" to 2)
   println(readWriteMap["foo"])  // prints "1"
   
   val strings = hashSetOf("a", "b", "c", "c")
   println("My Set Values are"+strings)
}

Приведенный выше фрагмент кода приводит к следующему выводу в браузере.

First Element of our list----1
Last Element of our list----4
Even Numbers of our List----[2, 4]
1
My Set Values are[a, b, c]

Изменяется

Диапазоны — еще одна уникальная особенность Котлина. Как и Haskell, он предоставляет оператор, который помогает вам перебирать диапазон. Внутри это реализовано с помощью rangeTo (), а оператор имеет вид (..) .

В следующем примере мы увидим, как Котлин интерпретирует этот оператор диапазона.

Live Demo

fun main(args: Array<String>) {
   val i:Int  = 2
   for (j in 1..4) 
   print(j) // prints "1234"
   
   if (i in 1..10) { // equivalent of 1 < = i && i < = 10
      println("we found your number --"+i)
   }
}

Приведенный выше фрагмент кода приводит к следующему выводу в браузере.

1234we found your number --2

Котлин — Контроль потока

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

Если еще

Kotlin — это функциональный язык, поэтому, как и любой функциональный язык в Kotlin, «если» — это выражение, это не ключевое слово. Выражение «если» будет возвращать значение всякий раз, когда это необходимо. Как и в других языках программирования, блок «if-else» используется в качестве начального оператора условной проверки. В следующем примере мы сравним две переменные и предоставим требуемый результат соответственно.

Live Demo

fun main(args: Array<String>) {
   val a:Int = 5
   val b:Int = 2
   var max: Int
   
   if (a > b) {
      max = a
   } else {
      max = b
   }
   print("Maximum of a or b is " +max)
 
   // As expression 
   // val max = if (a > b) a else b
}

Приведенный выше фрагмент кода приводит к следующему выводу в браузере. Наш пример также содержит еще одну строку кода, которая показывает, как использовать оператор «If» в качестве выражения.

Maximum of a or b is 5

Использование Когда

Если вы знакомы с другими языками программирования, возможно, вы слышали о выражении switch switch, которое в основном является условным оператором, когда к определенной переменной можно применить несколько условий. Оператор «когда» сопоставляет значение переменной с условиями ветвления. Если он удовлетворяет условию ветвления, он выполнит инструкцию внутри этой области. В следующем примере мы узнаем больше о «когда» в Kotlin.

Live Demo

fun main(args: Array<String>) {
   val x:Int = 5
   when (x) {
      1 -> print("x = = 1")
      2 -> print("x = = 2")
      
      else -> { // Note the block
         print("x is neither 1 nor 2")
      }
   }
}

Приведенный выше фрагмент кода приводит к следующему выводу в браузере.

x is neither 1 nor 2

В приведенном выше примере компилятор Kotlin сопоставляет значение x с заданными ветвями. Если он не соответствует ни одной из ветвей, он выполнит остальную часть. Практически, когда эквивалентно множественному блоку if. Kotlin предоставляет разработчику еще одну гибкость, поскольку разработчик может предоставить несколько проверок в одной строке, указав «,» внутри проверок. Давайте изменим приведенный выше пример следующим образом.

Live Demo

fun main(args: Array<String>) {
   val x:Int = 5
   when (x) {
      1,2 -> print(" Value of X either 1,2")
      
      else -> { // Note the block
         print("x is neither 1 nor 2")
      }
   }
}

Запустите то же самое в браузере, который выдаст следующий вывод в браузере.

x is neither 1 nor 2

Для петли

Цикл — это такое изобретение, которое обеспечивает гибкость для перебора любого типа структуры данных. Как и другие языки программирования, Kotlin также предоставляет много видов методологий Looping, однако среди них «For» является наиболее успешным. Реализация и использование цикла For концептуально аналогичны циклу Java for. В следующем примере показано, как мы можем использовать то же самое в реальных примерах.

Live Demo

fun main(args: Array<String>) {
   val items = listOf(1, 2, 3, 4)
   for (i in items) println("values of the array"+i)
}

В приведенном выше фрагменте кода мы объявили один список с именем «items» и, используя цикл for, выполняем итерацию по этому определенному списку и печатаем его значение в браузере. Ниже приводится вывод.

values of the array1
values of the array2
values of the array3
values of the array4

Ниже приведен еще один пример кода, где мы используем библиотечную функцию, чтобы сделать нашу разработку проще, чем когда-либо прежде.

Live Demo

fun main(args: Array<String>) {
   val items = listOf(1, 22, 83, 4)
   
   for ((index, value) in items.withIndex()) {
      println("the element at $index is $value")
   }
}

Как только мы скомпилируем и выполним вышеуказанный фрагмент кода в нашем коде, он выдаст следующий вывод в браузере.

the element at 0 is 1
the element at 1 is 22
the element at 2 is 83
the element at 3 is 4

В то время как Loop и Do-While Loop

Пока и Do-While работают точно так же, как и в других языках программирования. Единственное различие между этими двумя циклами состоит в том, что в случае цикла Do-while условие будет проверено в конце цикла. В следующем примере показано использование цикла While .

Live Demo

fun main(args: Array<String>) {
   var x:Int = 0
   println("Example of While Loop--")
   
   while(x< = 10) {
      println(x)
      x++
   } 
}

Приведенный выше фрагмент кода приводит к следующему выводу в браузере.

Example of While Loop--
0
1
2
3
4
5
6
7
8
9
10

Kotlin также имеет еще один цикл, называемый циклом Do-While, в котором тело цикла будет выполнено один раз, только тогда условие будет проверено. В следующем примере показано использование цикла Do-while .

Live Demo

fun main(args: Array<String>) {
   var x:Int = 0
   do {
      x = x + 10
      println("I am inside Do block---"+x)
   } while(x <= 50)
}

Приведенный выше фрагмент кода приводит к следующему выводу в браузере. В приведенном выше коде компилятор Kotlin выполнит блок DO, а затем перейдет к проверке состояния в блоке while.

I am inside Do block---10
I am inside Do block---20
I am inside Do block---30
I am inside Do block---40
I am inside Do block---50
I am inside Do block---60

Использование Return, Break, Continue

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

Return — Return — это ключевое слово, которое возвращает значение вызывающей функции из вызываемой функции. В следующем примере мы реализуем этот сценарий, используя нашу кодлинговую площадку Kotlin.

Live Demo

fun main(args: Array<String>) {
   var x:Int = 10
   println("The value of X is--"+doubleMe(x))
}
fun doubleMe(x:Int):Int {
   return 2*x;
}

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

The value of X is--20

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

Live Demo

fun main(args: Array<String>) {
   println("Example of Break and Continue")
   myLabel@ for(x in 1..10) { // appling the custom label
      if(x = = 5) {
         println("I am inside if block with value"+x+"\n-- hence it will close the operation")
         break@myLabel //specifing the label
      } else {
         println("I am inside else block with value"+x)
         continue@myLabel
      }
   }
}

Приведенный выше фрагмент кода приводит к следующему выводу в браузере.

Example of Break and Continue
I am inside else block with value1
I am inside else block with value2
I am inside else block with value3
I am inside else block with value4
I am inside if block with value5
-- hence it will close the operation

Как вы можете видеть, контроллер продолжает цикл до тех пор, пока значение x не станет равным 5. Как только значение x достигнет 5, он начнет выполнять блок if и, как только будет достигнут оператор break, весь поток управления завершит программу выполнение.

Котлин — Класс и Объект

В этой главе мы изучим основы объектно-ориентированного программирования (ООП) с использованием Kotlin. Мы узнаем о классе и его объекте, а также о том, как играть с этим объектом. По определению ООП класс — это план сущности во время выполнения, а объект — это его состояние, которое включает в себя как его поведение, так и состояние. В Kotlin объявление класса состоит из заголовка класса и тела класса, окруженного фигурными скобками, подобно Java.

Class myClass { // class Header 

   // class Body
}

Как и Java, Kotlin также позволяет создавать несколько объектов класса, и вы можете свободно включать его члены и функции. Мы можем контролировать видимость переменных членов класса, используя разные ключевые слова, которые мы изучим в главе 10 — Контроль видимости. В следующем примере мы создадим один класс и его объект, с помощью которого мы получим доступ к различным членам данных этого класса.

Live Demo

class myClass {
   // property (data member)
   private var name: String = "Tutorials.point"
   
   // member function
   fun printMe() {
      print("You are at the best Learning website Named-"+name)
   }
}
fun main(args: Array<String>) {
   val obj = myClass() // create obj object of myClass class
   obj.printMe()
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере, где мы вызываем printMe () myClass, используя его собственный объект.

You are at the best Learning website Named- Tutorials.point

Вложенный класс

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

Live Demo

fun main(args: Array<String>) {
   val demo = Outer.Nested().foo() // calling nested class method
   print(demo)
}
class Outer {
   class Nested {
      fun foo() = "Welcome to The TutorialsPoint.com"
   }
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

Welcome to The TutorialsPoint.com

Внутренний класс

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

Live Demo

fun main(args: Array<String>) {
   val demo = Outer().Nested().foo() // calling nested class method
   print(demo)
}
class Outer {
   private val welcomeMessage: String = "Welcome to the TutorialsPoint.com"
   inner class Nested {
      fun foo() = welcomeMessage
   }
}

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

Welcome to the TutorialsPoint.com

Аноним Внутренний Класс

Анонимный внутренний класс — это довольно хорошая концепция, которая делает жизнь программиста очень простой. Всякий раз, когда мы реализуем интерфейс, концепция анонимного внутреннего блока входит в картину. Концепция создания объекта интерфейса с использованием ссылки на объект во время выполнения называется анонимным классом. В следующем примере мы создадим интерфейс и создадим объект этого интерфейса, используя механизм класса Anonymous Inner.

Live Demo

fun main(args: Array<String>) {
   var programmer :Human = object:Human // creating an instance of the interface {
      override fun think() { // overriding the think method
         print("I am an example of Anonymous Inner Class ")
      }
   }
   programmer.think()
}
interface Human {
   fun think()
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

I am an example of Anonymous Inner Class 

Введите псевдонимы

Псевдонимы являются собственностью компилятора Kotlin. Он обеспечивает гибкость создания нового имени существующего типа, но не создает новый тип. Если имя типа слишком длинное, вы можете легко ввести более короткое имя и использовать его для будущего использования. Псевдонимы типа действительно полезны для сложного типа. В последней версии Kotlin отменил поддержку псевдонимов типов, однако, если вы используете старую версию Kotlin, вы можете использовать ее следующим образом:

typealias NodeSet = Set<Network.Node>
typealias FileTable<K> = MutableMap<K, MutableList<File>>

Котлин — Конструкторы

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

class Person(val firstName: String, var age: Int) {
   // class body
}

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

Live Demo

fun main(args: Array<String>) {
   val person1 = Person("TutorialsPoint.com", 15)
   println("First Name = ${person1.firstName}")
   println("Age = ${person1.age}")
}
class Person(val firstName: String, var age: Int) {
}

Приведенный выше фрагмент кода автоматически инициализирует две переменные и предоставит следующий вывод в браузере.

First Name = TutorialsPoint.com
Age = 15

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

Live Demo

fun main(args: Array<String>) {
   val HUman = HUman("TutorialsPoint.com", 25)
   print("${HUman.message}"+"${HUman.firstName}"+
      "Welcome to the example of Secondary  constructor, Your Age is-${HUman.age}")
}
class HUman(val firstName: String, var age: Int) {
   val message:String  = "Hey!!!"
	constructor(name : String , age :Int ,message :String):this(name,age) {
   }
}

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

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

Hey!!! TutorialsPoint.comWelcome to the example of Secondary  constructor, Your Age is- 25

Котлин — Наследование

В этой главе мы узнаем о наследовании. По определению, мы все знаем, что наследование означает накопление некоторых свойств родительского класса в дочерний класс. В Kotlin базовый класс называется «Any», который является суперклассом «любого» класса по умолчанию, объявленного в Kotlin. Как и все другие OOPS, Kotlin также предоставляет эту функцию, используя одно ключевое слово, известное как «:» .

Все в Kotlin по умолчанию является окончательным, поэтому нам нужно использовать ключевое слово «open» перед объявлением класса, чтобы сделать его допустимым для наследования. Взгляните на следующий пример наследования.

Live Demo

import java.util.Arrays

open class ABC {
   fun think () {
      print("Hey!! i am thiking ")
   }
}
class BCD: ABC(){ // inheritence happend using default constructor 
}

fun main(args: Array<String>) {
   var  a = BCD()
   a.think()
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

Hey!! i am thiking 

Теперь, что если мы хотим переопределить метод think () в дочернем классе. Затем нам нужно рассмотреть следующий пример, где мы создаем два класса и переопределяем одну из его функций в дочерний класс.

Live Demo

import java.util.Arrays

open class ABC {
   open fun think () {
      print("Hey!! i am thinking ")
   }
}
class BCD: ABC() { // inheritance happens using default constructor 
   override fun think() {
      print("I Am from Child")
   }
}
fun main(args: Array<String>) {
   var  a = BCD()
   a.think()
}

Приведенный выше фрагмент кода вызовет унаследованный метод дочернего класса и выдаст следующий вывод в браузере. Как и Java, Kotlin также не допускает множественное наследование.

I Am from Child 

Котлин — Интерфейс

В этой главе мы узнаем об интерфейсе в Kotlin. В Kotlin интерфейс работает точно так же, как в Java 8, что означает, что он может содержать реализацию методов, а также объявление абстрактных методов. Интерфейс может быть реализован классом для использования его определенной функциональности. Мы уже ввели пример с интерфейсом в главе 6 — раздел «анонимный внутренний класс». В этой главе мы узнаем больше об этом. Ключевое слово «interface» используется для определения интерфейса в Kotlin, как показано в следующем фрагменте кода.

interface ExampleInterface {
   var myVar: String     // abstract property
   fun absMethod()       // abstract method
   fun sayHello() = "Hello there" // method with default implementation
}

В приведенном выше примере мы создали один интерфейс с именем «ExampleInterface», и внутри него у нас есть пара абстрактных свойств и методов вместе. Посмотрите на функцию с именем «sayHello ()», которая является реализованным методом.

В следующем примере мы будем реализовывать вышеуказанный интерфейс в классе.

Live Demo

interface ExampleInterface  {
   var myVar: Int            // abstract property
   fun absMethod():String    // abstract method
   
   fun hello() {
      println("Hello there, Welcome to TutorialsPoint.Com!")
   }
}
class InterfaceImp : ExampleInterface {
   override var myVar: Int = 25
   override fun absMethod() = "Happy Learning "
}
fun main(args: Array<String>) {
   val obj = InterfaceImp()
   println("My Variable Value is = ${obj.myVar}")
   print("Calling hello(): ")
   obj.hello()
   
   print("Message from the Website-- ")
   println(obj.absMethod())
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

Calling hello(): Hello there, Welcome to TutorialsPoint.Com!
Message from the Website-- Happy Learning 

Как упоминалось ранее, Kotlin не поддерживает множественное наследование, однако, одно и то же может быть достигнуто путем реализации более двух интерфейсов одновременно.

В следующем примере мы создадим два интерфейса, а позже мы реализуем оба интерфейса в классе.

Live Demo

interface A {
   fun printMe() {
      println(" method of interface A")
   }
}
interface B  {
   fun printMeToo() {
      println("I am another Method from interface B")
   }
}

// implements two interfaces A and B
class multipleInterfaceExample: A, B

fun main(args: Array<String>) {
   val obj = multipleInterfaceExample()
   obj.printMe()
   obj.printMeToo()
}

В приведенном выше примере мы создали два примера интерфейсов A, B, а в классе с именем «множественный интерфейс» мы реализовали два интерфейса, объявленных ранее. Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

method of interface A
I am another Method from interface B

Котлин — Контроль видимости

В этой главе мы узнаем о различных модификаторах, доступных на языке котлин. Модификатор доступа используется для ограничения использования переменных, методов и классов, используемых в приложении. Как и другой язык программирования ООП, этот модификатор применим в нескольких местах, таких как заголовок класса или объявление метода. В Котлине есть четыре модификатора доступа.

Частный

Классы, методы и пакеты могут быть объявлены с частным модификатором. Как только что-либо объявлено как частное, оно будет доступно в его непосредственной области видимости. Например, личный пакет может быть доступен в этом конкретном файле. Закрытый класс или интерфейс могут быть доступны только его элементам данных и т. Д.

private class privateExample {
   private val i = 1
   private val doSomething() {
   }
}

В приведенном выше примере класс «privateExample» и переменная i могут быть доступны только в одном и том же файле Kotlin, где он упоминается, поскольку все они объявлены как private в блоке объявлений.

защищенный

Защищенный — это еще один модификатор доступа для Kotlin, который в настоящее время недоступен для объявления верхнего уровня, так как ни один пакет не может быть защищен. Защищенный класс или интерфейс виден только его подклассу.

class A() {
   protected val i = 1
}
class B : A() {
   fun getValue() : Int {
      return i
   }
}

В приведенном выше примере переменная «i» объявлена ​​как защищенная, следовательно, она видна только своему подклассу.

внутренний

Internal — это недавно добавленный модификатор, представленный в Kotlin. Если что-либо помечено как внутреннее, то это конкретное поле будет во внутреннем поле. Внутренний пакет виден только внутри модуля, под которым он реализован. Внутренний интерфейс класса виден только другому классу, присутствующему в том же пакете или модуле. В следующем примере мы увидим, как реализовать внутренний метод.

class internalExample {
   internal val i = 1
   internal fun doSomething() {
   }
}

В приведенном выше примере метод с именем «doSomething» и переменная упоминаются как внутренние, следовательно, эти два поля могут быть доступны только внутри пакета, в котором он объявлен.

общественного

Открытый модификатор доступен из любой точки рабочего пространства проекта. Если модификатор доступа не указан, то по умолчанию он будет в публичной области видимости. Во всех наших предыдущих примерах мы не упоминали ни одного модификатора, следовательно, все они находятся в публичной области видимости. Ниже приведен пример, позволяющий понять, как объявлять открытую переменную или метод.

class publicExample {
   val i = 1
   fun doSomething() {
   }
}

В приведенном выше примере мы не упомянули ни одного модификатора, поэтому все эти методы и переменные по умолчанию общедоступны.

Котлин — Расширение

В этой главе мы узнаем о другой новой функции Kotlin, названной «Extension». Используя расширение, мы сможем добавлять или удалять некоторые функции метода, даже не наследуя и не изменяя их. Расширения разрешены статистически. На самом деле он не изменяет существующий класс, но создает вызываемую функцию, которая может быть вызвана с помощью точечной операции.

Расширение функции

В расширении функции Kotlin позволяет определять метод вне основного класса. В следующем примере мы увидим, как расширение реализовано на функциональном уровне.

Live Demo

class Alien {
   var skills : String = "null"
	
   fun printMySkills() {
      print(skills)
   }		
}
fun main(args: Array<String>) {
   var  a1 = Alien()
   a1.skills = "JAVA"
   //a1.printMySkills()
	
   var  a2 = Alien()
   a2.skills = "SQL"
   //a2.printMySkills()
	
   var  a3 = Alien()
   a3.skills = a1.addMySkills(a2)
   a3.printMySkills()
}
fun Alien.addMySkills(a:Alien):String{
   var a4 = Alien()
   a4.skills = this.skills + " " +a.skills
   return a4.skills
}

В приведенном выше примере у нас нет никакого метода внутри класса «Alien» с именем «addMySkills ()», однако мы все еще реализуем тот же метод где-то за пределами класса. Это волшебство расширения.

Приведенный выше фрагмент кода сгенерирует следующий вывод в браузере.

JAVA SQL

Расширение объекта

Kotlin предоставляет еще один механизм для реализации статической функциональности Java. Это может быть достигнуто с помощью ключевого слова «объект-компаньон». Используя этот механизм, мы можем создать объект класса внутри метода фабрики, а позже мы можем просто вызвать этот метод, используя ссылку на имя класса. В следующем примере мы создадим «объект-компаньон».

Live Demo

fun main(args: Array<String>) {
   println("Heyyy!!!"+A.show())
}
class A {
   companion object {
      fun show():String {
         return("You are learning Kotlin from TutorialsPoint.com")
      }
   }
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

Heyyy!!! You are learning Kotlin from TutorialsPoint.com

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

Котлин — Классы данных

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

У всех классов данных должен быть один первичный конструктор, а у всех первичных конструкторов должен быть хотя бы один параметр. Всякий раз, когда класс помечается как данные, мы можем использовать некоторые встроенные функции этого класса данных, такие как «toString ()», «hashCode ()» и т. Д. Любой класс данных не может иметь модификатор, такой как абстрактный и открытый или внутренний. Класс данных может быть расширен и на другие классы. В следующем примере мы создадим один класс данных.

Live Demo

fun main(args: Array<String>) {
   val book: Book = Book("Kotlin", "TutorialPoint.com", 5)
   println("Name of the Book is--"+book.name) // "Kotlin"
   println("Puclisher Name--"+book.publisher) // "TutorialPoint.com"
   println("Review of the book is--"+book.reviewScore) // 5
   book.reviewScore = 7
   println("Printing all the info all together--"+book.toString()) 
   //using inbuilt function of the data class 
   
   println("Example of the hashCode function--"+book.hashCode())
}

data class Book(val name: String, val publisher: String, var reviewScore: Int)

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

Name of the Book is--"Kotlin"
Puclisher Name--"TutorialPoint.com"
Review of the book is--5
Printing all the info all together--(name-Kotlin, publisher-TutorialPoint.com, reviewScore-7)
Example of the hashCode function---1753517245

Котлин — Запечатанный Класс

В этой главе мы узнаем о другом типе класса, который называется «Запечатанный» класс. Этот тип класса используется для представления ограниченной иерархии классов. Sealed позволяет разработчикам поддерживать тип данных предварительно определенного типа. Чтобы создать запечатанный класс, нам нужно использовать ключевое слово «запечатанный» в качестве модификатора этого класса. Запечатанный класс может иметь свой собственный подкласс, но все эти подклассы должны быть объявлены в том же файле Kotlin вместе с запечатанным классом. В следующем примере мы увидим, как использовать запечатанный класс.

Live Demo

sealed class MyExample {
   class OP1 : MyExample() // MyExmaple class can be of two types only
   class OP2 : MyExample()
}
fun main(args: Array<String>) {
   val obj: MyExample = MyExample.OP2() 
   
   val output = when (obj) { // defining the object of the class depending on the inuputs 
      is MyExample.OP1 -> "Option One has been chosen"
      is MyExample.OP2 -> "option Two has been chosen"
   }
   
   println(output)
}

В приведенном выше примере у нас есть один запечатанный класс с именем «MyExample», который может быть только двух типов: один — «OP1», а другой — «OP2». В основном классе мы создаем объект в нашем классе и присваиваем его тип во время выполнения. Теперь, когда этот класс «MyExample» запечатан, мы можем применить условие «когда» во время выполнения для реализации окончательного результата.

В запечатанном классе нам не нужно использовать какой-либо ненужный оператор «else» для усложнения кода. Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

option Two has been chosen

Котлин — Дженерикс

Как и Java, Kotlin обеспечивает более высокий порядок типизации переменных, называемый Generics. В этой главе мы узнаем, как Kotlin реализует Generics и как разработчик может использовать эти функции, предоставляемые в библиотеке generics. С точки зрения реализации, дженерики очень похожи на Java, но разработчик Kotlin ввел два новых ключевых слова «out» и «in», чтобы сделать коды Kotlin более читабельными и удобными для разработчика.

В Kotlin класс и тип — это совершенно разные понятия. Согласно примеру, List является классом в Kotlin, тогда как List <String> является типом в Kotlin. В следующем примере показано, как дженерики реализованы в Kotlin.

fun main(args: Array<String>) {
   val integer: Int = 1
   val number: Number = integer
   print(number)
}

В приведенном выше коде мы объявили одно «целое число», а затем мы присвоили эту переменную числовой переменной. Это возможно, потому что «Int» является подклассом класса Number, поэтому преобразование типа происходит автоматически во время выполнения и выдает результат как «1».

Давайте узнаем больше о дженериках в Котлине. Лучше использовать общий тип данных, когда мы не уверены в типе данных, который мы будем использовать в приложении. Обычно в Kotlin дженерики определяются как <T>, где «T» обозначает шаблон, который может быть определен динамически компилятором Kotlin. В следующем примере мы увидим, как использовать универсальные типы данных в языке программирования Kotlin.

Live Demo

fun main(args: Array<String>) {
   var objet = genericsExample<String>("JAVA")
   var objet1 = genericsExample<Int>(10)
}
class genericsExample<T>(input:T) {
   init {
      println("I am getting called with the value "+input)
   }
}

В приведенном выше фрагменте кода мы создаем один класс с универсальным типом возвращаемого значения, который представлен как <T> . Взгляните на метод main, где мы динамически определяем его значение во время выполнения, проверяя тип значения при создании объекта этого класса. Вот как дженерики интерпретируются компилятором Kotlin. Мы получим следующий вывод в браузере, как только запустим этот код в нашем коде.

I am getting called with the value JAVA
I am getting called with the value 10

Когда мы хотим назначить универсальный тип любому из его супертипа, нам нужно использовать ключевое слово «out», а когда мы хотим назначить универсальный тип любому из его подтипа, тогда нам нужно использовать «in» ключевое слово. В следующем примере мы будем использовать ключевое слово «out». Точно так же вы можете попробовать использовать ключевое слово «in».

Live Demo

fun main(args: Array<String>) {
   var objet1 = genericsExample<Int>(10)
   var object2 = genericsExample<Double>(10.00)
   println(objet1)
   println(object2)
}
class genericsExample<out T>(input:T) {
   init {
      println("I am getting called with the value "+input)
   }
}

Приведенный выше код выдаст следующий вывод в браузере.

I am getting called with the value 10
I am getting called with the value 10.0
genericsExample@28d93b30
genericsExample@1b6d3586

Котлин — Делегация

Kotlin поддерживает шаблон проектирования «делегирование» , вводя новое ключевое слово «by» . Используя это ключевое слово или методологию делегирования, Kotlin позволяет производному классу получать доступ ко всем реализованным публичным методам интерфейса через определенный объект. Следующий пример демонстрирует, как это происходит в Kotlin.

Live Demo

interface Base {
   fun printMe() //abstract method
}
class BaseImpl(val x: Int) : Base {
   override fun printMe() { println(x) }   //implementation of the method
}
class Derived(b: Base) : Base by b  // delegating the public method on the object b

fun main(args: Array<String>) {
   val b = BaseImpl(10)
   Derived(b).printMe() // prints 10 :: accessing the printMe() method 
}

В этом примере у нас есть один интерфейс «Base» с абстрактным методом «printme ()». В классе BaseImpl мы реализуем этот «printme ()», а позже из другого класса мы используем эту реализацию, используя ключевое слово «by».

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

10

Делегирование недвижимости

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

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

Использование Lazy ()

Lazy — это лямбда-функция, которая принимает свойство в качестве входа и, в свою очередь, дает экземпляр Lazy <T> , где <T> — это тип используемых им свойств. Давайте посмотрим на следующее, чтобы понять, как это работает.

Live Demo

val myVar: String by lazy {
   "Hello"
}
fun main(args: Array<String>) {
   println(myVar +" My dear friend")
}

В приведенном выше фрагменте кода мы передаем переменную «myVar» в функцию Lazy, которая в свою очередь присваивает значение своему объекту и возвращает его основной функции. Ниже приведен вывод в браузере.

Hello My dear friend

Delegetion.Observable ()

Observable () принимает два аргумента для инициализации объекта и возвращает то же самое вызываемой функции. В следующем примере мы увидим, как использовать метод Observable () для реализации делегирования.

Live Demo

import kotlin.properties.Delegates
class User {
   var name: String by Delegates.observable("Welcome to Tutorialspoint.com") {
      prop, old, new ->
      println("$old -> $new")
   }
}
fun main(args: Array<String>) {
   val user = User()
   user.name = "first"
   user.name = "second"
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

first -> second

Обычно синтаксис — это выражение после делегирования ключевого слова «by». Методы get () и set () переменной p будут делегированы ее методам getValue () и setValue (), определенным в классе Delegate.

class Example {
   var p: String by Delegate()
}

Для приведенного выше фрагмента кода ниже приведен класс делегата, который нам нужно сгенерировать, чтобы присвоить значение переменной p .

class Delegate {
   operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
      return "$thisRef, thank you for delegating '${property.name}' to me!"
   }
   operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
      println("$value has been assigned to '${property.name} in $thisRef.'")
   }
}

Во время чтения будет вызван метод getValue () и при установке переменной будет вызван метод setValue ().

Котлин — Функции

Котлин является языком статической типизации, поэтому функции играют в нем большую роль. Мы довольно хорошо знакомы с функцией, так как мы используем функцию во всех примерах. Функция объявлена ​​с ключевым словом «весело». Как и любой другой ООП, он также нуждается в типе возврата и списке аргументов опции.

В следующем примере мы определяем функцию MyFunction, а из основной функции мы вызываем эту функцию и передаем некоторый аргумент.

Live Demo

fun main(args: Array<String>) {
   println(MyFunction("tutorialsPoint.com"))
}
fun MyFunction(x: String): String {
   var c:String  = "Hey!! Welcome To ---"
   return (c+x)
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

Hey!! Welcome To ---tutorialsPoint.com

Функция должна быть объявлена ​​следующим образом:

fun <nameOfFunction>(<argument>:<argumentType>):<ReturnType>

Ниже приведены некоторые из различных типов функций, доступных в Kotlin.

Лямбда-функция

Лямбда — это функция высокого уровня, которая значительно сокращает код пластины котла, одновременно объявляя и определяя функцию. Kotlin позволяет вам определить свою собственную лямбду. В Kotlin вы можете объявить свою лямбду и передать эту лямбду в функцию.

Посмотрите на следующий пример.

Live Demo

fun main(args: Array<String>) {
   val mylambda 🙁String)->Unit  = {s:String->print(s)}
   val v:String = "TutorialsPoint.com"
   mylambda(v)
}

В приведенном выше коде мы создали нашу собственную лямбду, известную как «mylambda», и мы передали одну переменную в эту лямбда, которая имеет тип String и содержит значение «TutorialsPoint.com».

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

TutorialsPoint.com

Встроенная функция

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

Посмотрите на следующий пример.

Live Demo

fun main(args: Array<String>) {
   val mylambda🙁String)->Unit  = {s:String->print(s)}
   val v:String = "TutorialsPoint.com"
   myFun(v,mylambda) //passing lambda as a parameter of another function 
}
fun myFun(a :String, action: (String)->Unit) { //passing lambda 
   print("Heyyy!!!")
   action(a)// call to lambda function
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере. Используя встроенную функцию, мы передали лямбду в качестве параметра. Любую другую функцию можно сделать встроенной функцией, используя ключевое слово «inline».

Heyyy!!!TutorialsPoint.com

Котлин — Разрушительные декларации

Kotlin содержит множество функций других языков программирования. Это позволяет вам объявлять несколько переменных одновременно. Эта техника называется Декларация разрушения.

Ниже приведен основной синтаксис декларации деструктурирования.

val (name, age) = person

В приведенном выше синтаксисе мы создали объект и определили их все вместе в одном выражении. Позже мы можем использовать их следующим образом.

println(name)
println(age)

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

Live Demo

fun main(args: Array<String>) {
   val s = Student("TutorialsPoint.com","Kotlin")
   val (name,subject) = s
   println("You are learning "+subject+" from "+name)
}
data class Student( val a :String,val b: String ){
   var name:String = a
   var subject:String = b
}

Приведенный выше фрагмент кода выдаст следующий вывод в браузере.

You are learning Kotlin from TutorialsPoint.com

Котлин — Обработка исключений

Обработка исключений является очень важной частью языка программирования. Этот метод ограничивает наше приложение от генерирования неправильного вывода во время выполнения. В этой главе мы узнаем, как обрабатывать исключения во время выполнения в Kotlin. Исключения в Kotlin очень похожи на исключения в Java. Все исключения являются потомками класса Throwable. Следующий пример показывает, как использовать технику обработки исключений в Kotlin.

fun main(args: Array<String>) {
   try {
      val myVar:Int = 12;
      val v:String = "Tutorialspoint.com";
      v.toInt();
   } catch(e:Exception) {
      e.printStackTrace();
   } finally {
      println("Exception Handeling in Kotlin");
   }
}

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

val myVar:Int = 12;
Exception Handeling in Kotlin

Примечание. Как и Java, Kotlin также выполняет блок finally после выполнения блока catch.