kotlin学习记录
1.Array. 等价java中的数组类型
2.kotlin类中声明的成员变量(无论是var/val)都必须初始化,或者使用lateinit修饰,在后面使用前初始化,这和java不一样,防止出现NullPointException;
但是在kotlin函数中的局部变量是可以不用初始化,编译可以通过;
还有一种,可以通过自定义访问器给属性赋值
class Student(val name: String, var age: Int) {
// 自定义属性访问器
val isSquare: Boolean
get() {
return name == "lala"
}
}
3.创建kotlin的文件时会有一个选择,file,class,这个两个的区别是,如果这个文件有并排的两个class,这个文件就是xxx.kt,如果只有这一个class,文件为xxx
image.png
image.png
创建kotlin文件时一般选择类型为class,后续如果有并排的class会自动转换为file类型,增加.kt
后缀
4.if在kotlin中是表达式,有返回值,when是类似java中的switch,但是when也是表达式,有返回值,他们会把最后一个表达式会被作为结果返回;
when中没有break,不会穿透执行,如果需要多个值匹配,需要值之间用“,"分隔开,when允许使用任何对象作为作为分支条件,不像java必须是常量(枚举常量,字符串或者数字);when还可以不用带参数;
fun testWhen(num: KotlinEnum) {
val value = when (num) {
KotlinEnum.RED,KotlinEnum.BLUE -> "k"
else -> "else"
}
println("when:is $value")
}
fun whenTest(num1: KotlinEnum,num2: KotlinEnum){
when {
num1 == KotlinEnum.BLUE && num2 == KotlinEnum.RED ||
num1 == KotlinEnum.RED && num2 == KotlinEnum.BLUE -> 1
else -> 2
}
}
5.Set集合,kotlin有一个set集合:https://www.jianshu.com/p/3c95d7729d69
集合的遍历:
fun testSet(){
// setOf返回的是不可变的有序的集合
val set = setOf<String>("2","3")
// for + in 是对set集合的遍历
for (name in set) {
println(name)
}
}
6.is 相当于java中的instanceOf,不同之处,java中需要显示的类型转换后才能使用,如果需要多次使用需要用局部变量保存,kotlin不需要
fun testIs(stu: Fu){
// is 相当于java中的instanceOf,不同之处,java中需要显示的类型转换后才能使用,如果需要多次使用需要用局部变量保存,kotlin不需要
if (stu is Stu) {
// 能访问的属性必须是一个val属性,不能有自定义的访问器,否则不能保证每次返回同样的值
println(stu.a)
}
// 特定类型的显示转换
val stu1 = stu as Stu
println(stu1.a)
}
7.for循环遍历
fun testFor(){
val array = IntArray(4)
// array这个数组的下标
for (i in array.indices){
}
// 包含右边的结束值的区间
for (i in 100 downTo 1 step 2) {
}
// until 不包含100的区间
for (i in 1 until 100) {
}
val treeMap:TreeMap<Char,String> = TreeMap()
// map,通过map[key] 来读取值 ,map[key] = value 赋值,不用通过put,get方法
treeMap['a'] = "aaaa"
treeMap['b'] = "bbbb"
// treemap的遍历
for ((key,value) in treeMap) {
println("$key = $value")
}
val list = arrayListOf<Int>(3,5)
for ((index,element) in list.withIndex()) {
}
}
8.trow,try是一个表达式,if/when(switch)也是表达式
val percentage = 0
if (percentage !in 0..100) {
// throw是一个表达式
throw IllegalArgumentException("")
}
// try是一个表达式
// 如果一个try代码块执行一切正常代码块中的最后一个表达式就是结果,如果捕获了异常,相应的catch代码块中最后一个表达式就是结果
val number = try {
Integer.parseInt("34")
} catch (e:NumberFormatException) {
return
}
println(number)
9.扩展函数,是静态函数,在java中可以通过文件名.方法名,直接调用,扩展函数不能被重写
扩展函数是写在类的外面
image.png
使用是,可以import这个函数;
10.to函数 中缀调用,能以中缀调用的函数需要用infix修饰, 处理单个参数的函数;
// to 中缀调用 to函数有infix修饰
val map = hashMapOf<Int,String>(1 to "one",7 to "seven")
11.kotlin中的String增加了一些扩展方法,还可以继续使用正则表达式,三重引号的字符串可以避免转义字符,可以包含任何字符;
12.嵌套的类默认不是内部类:他们并没有包含对其外部类的隐式引用;kotlin有一个可以声明类并创建这个类的一个实例的object关键字(类似于java的匿名类);使用:代替java中的extends/implements关键字;同java一样,一个类可以实现多个接口,但只能继承一个类;
kotlin中,接口里可以有默认方法(提供了方法体),但是java中没有这样的语法,java中如果继承了kotlin的接口,必须实现所有的方法;
12.修饰符:
class DataModel {
var name: String? = null // ??
lateinit var name1: String
val age: Int = 2
// 先走init,再走constructor,这两个
init {
println("init: ")
}
//
constructor() {
println(": constructor")
}
fun setup() {
// name1初始化,使用name1之前必须先调用这个方法进行初始化,否则报异常
name1 = "lala"
}
}