本文只是提供给入门级的 KT 学者,提供最基本的 KT 使用方法,会持续更新补充~
1. 变量
-
可变变量定义: var 关键字
eg:var <标识符> :<类型> = <初始化值> -
不可变变量定义:val 关键字,只能赋值一次的变量(有一点点类似Java中final修饰的变量)
eg:val <标识符> : <类型> = <初始化值>
class Test {
// 可以改,可以读 get set
var info1 : String = "A"
// 只能读, 只有 get
val info2 : String = "B"
}
2. 方法
// 返回类型Int
fun add(number1: Int, number2: Int): Int {
return number1 + number2
}
// 返回类型 == 类型推导 String
fun add3(number1: Int, number2: Int) = "AAA"
// 可变参数 (可变长 参数函数)
fun lenMethod(vararg value: Int) {
for (i in value) {
println(i)
}
}
// void == :Unit
fun main(): Unit {
// lambda表达式函数
val addMethod : (Int, Int) -> Int = {number1, number2 -> number1 + number2}
val r= addMethod(9, 9)
println(r)
}
3. 字符串
// $ 表示一个变量名或者变量值
// $varName 表示变量值
// ${varName.fun()} 表示变量的方法返回值
val name = "张三"
val age = 28
val sex = 'M'
val info = "ABCDEFG"
println("name:$name, age:$age, sex:$sex info:$info") // 相较于 Java 的 + 使用起来更方便
4. NULL 检查机制
Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,
有两种处理方式:
1:字段后加!!像Java一样抛出空异常
2:另一种字段后加?
var info: String? = null
println(info?.length) // 第一种补救:? 如果info是null,就不执行 .length
println(info!!.length) // 第2种补救: !! 我自己负责info 不会为null == (不管null不null必须执行) == Java
if (info != null) // 第3种补救: == Java
println(info.length)
println(info?.length ?: "你很牛逼") // ?: 如果你一定要输出null 就让你 “你很牛逼”
// : Int? === 允许返回null
fun testMethod(name: String) : Int? {
if (name == "zs") {
return 99999
}
return null
}
5. 区间
// 1 到 9
for (i in 1..9) {
// println(i)
}
// 不会输出
for (i in 9..1) {
// println(i)
}
// 大 到 小
for (i in 9 downTo 1) {
// println(i)
}
// 用区间做判断
val value = 88
if (value in 1..100) {
// println("包了 1 到 100")
}
// 步长指定
for (i in 1..20 step 2) {
// 1 3 5 7 ...
// println(i)
}
// 排除 最后元素
for (i in 1 until 10) {
println(i)
}
6. 比较
val name1: String = "张三"
val name2: String = "张三"
// === 比较值本身
// == 等价 Java的equals
println(name1.equals(name2)) //false
println(name1 == name2) //true
// === 比较对象地址
val test1:Int? = 10000
val test2:Int? = 10000
println(test1 === test2) // false
7. 数组
// 第一种形式
val numbers = arrayOf(1, 2, 3, 4, 5, 6, 7, 8)
// println(numbers[0])
// println(numbers[7])
for (number in numbers) {
// println(number)
}
// 第二种形式 value=0
// 0 + 200 = 200
// 1 + 200 = 201
val numbers2 = Array(10, {value: Int -> (value + 200) })
for (value in numbers2) {
println(value)
}
8. 条件判断
// 表达式 比 大小 最大值
val maxValue = if (number1 > number2) number1 else number2
val max: Int = if (number1 > number2) {
println("number1是最大的哦")
// TODO
// ....... 省略 200行代码
number1
} else {
println("number2是最大的哦")
// TODO
// ....... 省略 200行代码
number2
}
// 使用区间做判断
val x = 80
val y = 29
if (x in 1..10 && y in 1..50) {
// println("x y 轴 符合")
} else {
// println("x y 轴 不符合")
}
val number = 5
when(number) {
1 -> println("一")
2 -> println("二")
3 -> println("三")
4 -> println("四")
5 -> println("五")
else -> println("其他")
}
val number = 3
val result = when (number) {
1 -> {
println("很开心")
// 很多很多的逻辑.. 省略 200行代码
// ...
// TODO ....
"今天是星期一"
99
}
2 -> {
println("很开心")
// 很多很多的逻辑.. 省略 200行代码
// ...
// TODO ....
"今天是星期二"
88
}
3 -> {
println("很开心")
// 很多很多的逻辑.. 省略 200行代码
// ...
// TODO ....
"今天是星期三"
true
100
}
else -> 99
}
when (8) {
1, 2, 3, 4, 5, 6, 7 -> println("满足")
else -> println("不满足")
}
9.循环
var items = listOf<String>("李四", "张三", "王五")
for (item in items) {
println(item)
}
items.forEach {
println(it)
}
for (index in items.indices) {
println("下标:$index, 对应的值:${items[index]}")
}
// 自定义标签
tttt@ for (i in 1..20) {
for (j in 1..20) {
println("i:$i, j:$j")
if (i == 5) {
// break // j循环 给break
break@tttt // i循环 给break
}
}
}
10. 类
// public final class Person 默认就是这样的,不能被继承, 可以加open就可以被人家继承了
open class Person(id: Int) // 主构造
{
// 次构造
constructor(id: Int, name: String) : this(id) {
}
// 次构造
constructor(id: Int, sex: Char) : this(id) {
}
// 次构造
constructor() : this(787) {
}
// lateinit 懒加载 没有赋值 就不能使用,否则报错
lateinit var name : String
}
网友评论