kotlin语法快速入门--(完整版)
温馨提示:这篇文章已超过386天没有更新,请注意相关的内容是否还可用!
Kotlin语法入门
文章目录
- Kotlin语法入门
- 一、变量声明
- 1、整型
- 2、字符型
- 3、集合
- 3.1、创建array数组
- 3.2、创建list集合
- 3.3、不可变类型数组
- 3.4、Set集合--不重复添加元素
- 3.5、键值对集合Map
- 4、kotlin特有的数据类型和集合
- 4.1、Any、Nothing
- 4.2、二元组--Pair
- 4.3、三元组--Triple
- 5、const关键字
- 二、条件控制和循环语句
- 1、if...else
- 2、when
- 2.1、常规用法
- 2.2、特殊用法--并列:
- 2.3、特殊用法--类型判断:
- 2.4、特殊用法--区间:
- 2.5、返回值
- 3、循环
- 3.1、for..in
- 3.2、forEach
- 3.3、迭代器
- 3.4、【扩展】for..in中的withIndex方法
- 3.5、【扩展】forEachIndexed()方法
- 3.6、do...while和while
- 4、return,break,continue结束语句的使用
- 4.1、结束循环分支
- 4.2、标签备注代码块--@
- 4.3、forEach退出循环的几种方式
- 三、区间
- 1、语法
- 2、遍历
- 3、查找是否在区间内
- 4、字符区间
- 四、函数
- 1、函数定义
- 2、infix关键字
- 3、参数省略
- 4、函数类型参数
- 5、多参数--vararg
- 五、访问和属性修饰符
- 1、kotlin修饰符
- 2、internal
- 3、默认修饰符
- 4、open关键字开启继承并实现
- 六、类与对象
- 1、声明和调用
- 2、get和set
- 3、init函数初始化
- 4、constructor构造函数
- 4.1、主构造函数
- 4.2、二级构造函数
- 4.3、多个构造函数
- 4.4、省略主构造函数并写了次构造函数
- 5、类的继承与重写
- 5.1、继承
- 5.2、继承构造函数初始化
- 5.3、函数的重写
- 5.4、属性的重写
- 6、抽象类、嵌套类和内部类
- 6.1、抽象类
- 6.2、嵌套类
- 6.3、内部类
- 七、自定义注解
- 八、接口与接口实现
- 1、接口定义与实现
- 2、接口成员变量
- 2.1、单个接口函数复写
- 2.2、多个接口同名函数复写
- 2.2、接口成员存在变量和常量
- 九、数据类、伴生类、枚举类
- 1、数据类
- 2、伴生类
- 2.1、定义伴生类
- 2.2、@JvmStatic注解
- 2.3、const关键字
- 3、枚举类
- 3.1、定义
- 3.2、传参
- 3.3、继承与实现
- 十、单例和对象表达式
- 1、单例模式的创建
- 2、对象表达式
- 十一、密封类和密封接口
- 1、密封类
- 2、密封接口
一、变量声明
1、整型
fun main() { var b: Int = 1 //var 变量名:变量类型=值 val c=100 //var 常量名:变量类型=值 }kotlin中的变量是自动推导的,其中变量类型Int是可以省略的。
2、字符型
定义就与上面一样,调用的方法也与java差不多,equals等。
占位符:
fun main() { var string: String = "hello world !" println("hello ${string}") //输出 }多模版输出:
fun main() { var string: String =""" 1 2 3 4 5 6 7 8 9 10 """.trimIndent() //此方法可以忽略缩进 println(string) }3、集合
前景提要:除了数组都分为可变集合和不可变集合,区别就是在前面加上前缀mutable,这是kotlin语法中特有的。
关键字如下:
- array==>arrayof
- list==>listof
- 可变list==>mutableListOf
3.1、创建array数组
fun main() { var array: Array = arrayOf( 1,2,3) var get = array.get(0) println(get) }以上是常规的创建方法,也可以用自定义的方法,下面以Int为例,其实基本数据类型都是有的。
fun main() { var array: IntArray = intArrayOf(1, 2, 3) //int数组 var array1: Array = emptyArray() // 空数组 }3.2、创建list集合
fun main() { var listOf = listOf( 1, 2, 3) println(listOf[0]) //获取第1个数据 }当然,Int前面或者后面写一个就行。上述集合是可变的
3.3、不可变类型数组
fun main() { var array: IntArray = intArrayOf(1, 2, 3) var mutableListOf = mutableListOf(1, 2, 3) array.add() //不可变,没有add() mutableListOf.add(6) //可变,有add() }3.4、Set集合–不重复添加元素
不可变集合的方式:
fun main() { setOf(1, 2, 3, 3, 3, 3).forEach{ //遍历集合 println(it) } }可变集合的方式:
fun main() { var mutableSetOf = mutableSetOf(1, 2, 3, 4, 5) }3.5、键值对集合Map
中间用to来实现键值对的配对
fun main() { var mutableMapOf = mutableMapOf("1" to 1, "11" to 11) //多个参数逗号隔开 mutableMapOf.put("2", 2) mutableMapOf.put("3", 3) println(mutableMapOf["1"]) //获取键为1的数据 println(mutableMapOf.keys) //keys是获取所有的key的set集合 println(mutableMapOf.keys.size) //数据长度 }4、kotlin特有的数据类型和集合
4.1、Any、Nothing
Any不再介绍,类似于Java中的Object。
Nothing:没有什么是没有实例的。您可以使用Nothing来表示“一个永远不存在的值”:例如,如果函数的返回类型为Nothing,则意味着它永远不会返回(总是抛出异常)。
可以看kotlin中的null就是这样的一个数据类型:
kotlin中最具有特色的是:不会有空指针存在
法一:
解释:b在拼接3的时候,?就会进行判定b是否为空,如果b为空那就不会调用plus方法,这样就避免了空指针异常。
(上述输出为null,即调用b.toString()方法输出。)
法二:
还有一点就是b在一定不为空的情况下,则可以使用!!强制赋值,例如:

并且后续使用b调用方法都不用再使用?判定b值是否为空。
法三:
使用lateinit关键字(只能对复杂类型初始化)进行初始化延后,但是不推荐这种写法,类似于欺骗编译器我等一会初始化,例如:

4.2、二元组–Pair
与下面的Triple一样都是属于kotlin中特有的数据集合。
fun main() { var pair = Pair(1, 2) println("第一个值:${pair.first},第二个值:${pair.second}") }4.3、三元组–Triple
fun main() { Triple(1, 2, 3).let { println(it.first) println(it.second) println(it.third) } }5、const关键字
在Kotlin中,const关键字只能用于以下情况:
- 伴生对象中的属性:const关键字可以用于伴生对象中的属性,将其声明为常量。
- 顶层属性:const关键字可以用于顶层属性,将其声明为常量。
- 原生数据类型和String类型:const关键字只能用于基本数据类型(如Int、Long、Double等)和String类型。
需要注意的是,const关键字所修饰的属性必须在编译时就能确定其值,不能是运行时才能确定的值。
另外,const关键字只能用于编译期常量,而不能用于运行时常量。因此,在使用const关键字时需要遵守以上规则
二、条件控制和循环语句
1、if…else
常规分支:
fun main() { var a = 1 if (a == 1) { println("a is 1") } else { println("a is not 1") } }kotlin新特性:if语句可以有返回值
fun main() { var a = 1 val b = if (a == 1) { 3 } else { 4 } println(b) }像上述这种,假如条件成立,则赋值给a,返回值不用return 即可返回。
但是,注意的是假如要有返回值,则必须要写else分支。
多分支已是如此:
fun main() { var a = 1 val b = if (a == 1) { 3 } else if(a==3) { 4 }else{ 5 } println(b) }由于kotlin没有三元表达式,所以,可以使用if及其分支拟造一个三元表达式:
fun main() { var a = 1 var b = 2 val c = if (a == b) true else false println(c) }2、when
2.1、常规用法
关于when的用法,可以对标Java中的Switch,示例代码如下:
fun main() { var a = 1 when (a) { 1 -> println("a is 1") 2 -> println("a is 2") else -> println("a is null") } }其中,else是默认输出语句,对标Java中的default
2.2、特殊用法–并列:
fun main() { var a = 1 when (a) { 1,3 -> println("a is 1") //1或3 2 -> println("a is 2") else -> println("a is null") } }2.3、特殊用法–类型判断:
fun main() { var a: Any = 1 when (a) { is Int -> println("a is Int") is String -> println("a is String") else -> println("a is else") } }2.4、特殊用法–区间:
fun main() { var a: Any = 1 when (a) { in 1..10 -> println("a is in range") is String -> println("a is a String") else -> println("none of the above") } }值得注意的是,每当判断到成立条件的时候,下面的条件不管成立否都不会执行。
还有,多个条件可以并列写,例如:
fun main() { var a: Any = 11 when (a) { in 1..10,is Int -> println("a is in range or is Int") else -> println("none of the above") } }2.5、返回值
与if一样,kotlin的when也可以带上返回值,将返回值写在执行的最后一样即可:
fun main() { var a: Any = 11 val b = when (a) { in 1..10 -> { println("a is in range") 1 } is Int -> { println("a is a Int") 2 } else -> { println("none of the above") 3 } } println(b) }3、循环
3.1、for…in
fun main() { var list = (1.. println(i) } } var list = (1.. println(it) } } var list = ('a'..value- println(value) } } var list = (1.. println(iterator.next()) } } var list = ('a'.. println("$index $i") } } var list = ('a'..index, value- println("$index $value") } } var i = 1 do { println("$i") } while (i++ println("玩家3") is EnemyType1 -> println("敌人1") is EnemyType2 -> println("敌人2") is EnemyType3 -> println("敌人3") } } fun handerWeapon(role: Weapon) { when (role) { is PlayerType1 -> println("玩家1") is PlayerType2 -> println("玩家2") is PlayerType3 -> println("玩家3") is EnemyType1 -> println("敌人1") is EnemyType2 -> println("敌人2") is EnemyType3 -> println("敌人3") } } sealed interface Health {} sealed interface Weapon {} class PlayerType1 : Health, Weapon class PlayerType2 : Health, Weapon class PlayerType3 : Health, Weapon class EnemyType1 : Health, Weapon class EnemyType2 : Health, Weapon class EnemyType3 : Health, Weapon











