Kotlin

Kotlin

Anton Lavrov

var a : Int = 7

var b : Int

var c = 7

var - переменная, val - константа

Меняется не значение переменной, а ссылка на ее объект


Типы данных

Float 32

Double 64

Byte 8

Short 16

Int 32

Long 64

String


readLine() - ввод (тип "String?")

val a = readLine()

println() - вывод

.toInt() - привести к Int (7 + s.toInt())

.toDouble() и т. д.


println("Age: ${s}") - строковой шаблон


Функции

fun sum (a : Int = 7, b : Int) : Int {

return a + b

}


sum(7, 9)

sum(b = 8)

sum(b = 3, a = 1)


Еще

when (x) {

5 -> print("==5")

6, 7 -> print("6 or 7")

in 1..10 -> print("1..10")

in 200..202 -> { print(5); print(6) }

else -> print("nothing")

}


when {

x == 5 -> println("5")

x != 6 -> println("!=6")

x == 7 || x == 8 -> println("7, 8")

else ->println("nothing")

}


Циклы

while (x > 0) {

x--;

}


do {

val y = fun1()

} while (y != null)


for (el in array) { ... }


for (i in 0..5) { ... }

for (i in 0..5 step 2) { ... }

for (i in 5 downto 0) { ... }

for (i in 0 until 5) { ... }


Классы

Поля public по дефолту (поля это свойства по механизму, все подменяется на get и set, их можно переопределять)

class rectangle {

public var h : Int = 0

var w : Int = 0

get() { field } // под объявляемым свойством

set(v) { field = v }


public fun sq() {

return h * w

}


Конструкторы - первичные и второстепенные. Первичный может быть только один, тела в нем быть не может. Можно сразу присваивать, либо написать инициализирующий блок.

class rectangle (h : Int, w : Int) {

var h : Int = h

var w : Int = w

init {

this.h = h

this.w = w

}

}

Можно вот так:

class rectangle (var h : Int, var w : Int)

Делает то же самое.


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

class rectangle (var h : Int, var w : Int) {

constructor (x1 : Int, y1 : Int, x2 : Int, y2 : Int) : this(y2 - y1, x2 - x1) {

print("!")

}

Тернарный оператор: str += if (lvl % 2 == 0) 1 else 0


Private класса в классе не видны классом


По умолчанию все закрыто для наследования, надо указывать open.

open class rectangle (var h : Int, var w : Int) {

open fun sq () = h * w

}

class magicRect (h : Int, w : Int) : rectangle(h, w) {

override fun sq() = 42 * super.sq() // super класс

}

override по умолчанию open, если поставить final, в потомках изменять нельзя будет. Если наследуемся и от класса, и от интерфейса (могут содержать не только абстрактные методы, но и методы с реализацией):

interface Magic {

fun Magic() = 42

}

class magicRect (h : Int, w : Int) : rectangle(h, w), Magic {

override fun sq() = super<Magic>.Magic() * super<rectangle>.sq() // super класс

}


Инициализация

val list1 = listOf<string>("1", "two", "3")

val list2 : Array<String> = emptyArray()

val list3 = Array <Int>(100, {i -> i * i})


val list_of_numbers = str.split(",")


Исключения

try {

//Danger!

callMagic()

}

catch (e : CustomException) { // Обработчик, исключения - наследники throwable

...

} catch (e : SomeException) { ... }

finally { ... } // Будет выполнен в любом случае


Могут возвращать значения

var port = try { ParseInt(readLine())} catch (...) { -1 }

fun main(args: Array<String>) {
    val str:String? = readLine()
    if (str == null) return

    val list_of_numbers = str.split(",")
    var sum : Int = 0
    for (number in list_of_numbers) {
        sum += try { number.toInt() } catch (e : NumberFormatException) { 0 }
    }
    println("Sum = ${sum}")
}



Типы Null

Названия Non-null от Nullable отличаются знаком ? в конце


Оператор безопасного вызова

var b = a?.length

То же, что if (a == null) {null} else {a.length}


Elvis operator

var b = a?.length ?: -1

Что хотим записать в b, если слева от Elvis равно Null


Оператор небезопасного вызова

var b = a!!.length

Если не Null, то все в порядке, иначе NullPointerException


Manifests

Мета-информация


Java

Исходники (самого приложения, инструментальные тесты, юнит-тесты - тестирование общей логики, запускаются на самом устройстве)


Res

Ресурсы приложения - картинки (drawable), описание пользовательского интерфейса (layout), иконки (mipmap), для локализации по языкам и устройствам (values)


OnCreate - точка входа, начинает работу, когда создается Activity


Log

Логгирование

Log.d("TAG", "HelloWorld!")


Report Page