Kotlin
Anton Lavrovvar 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!")