一、数据类型(无基础数据类型,均为对象)
类型 | 位数 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
UByte | 8 |
UShort | 16 |
UInt | 32 |
ULong | 64 |
二、可见性修饰符
三、定义属性
(1)var定义变量
(2)val定义常量
(3)支持类型自动推导
(4)属性可空(如String?),空安全调用(?.),为空重新赋值(?:)
四、类型转换
(1)is类型判断(满足类型判断条件,会自动进行类型转换)
(2)as类型转换
(3)as?安全类型转换
五、for循环
// 集合遍历
for (item in collection) {
}
// 1到4递增循环 1,2,3,4
for (i in 1..10) {
}
// 8到0以2为步长进行递减8,6,4,2,0
for (i in 8 downTo 0 step 2) {
}
//遍历map
for ((a, b) in mapOf("1" to 1, "2" to 2)){
Log.e("aa", "*******$a $b")
}
六、when(高级版的switch)
when(){
a == 1 -> {}
b == "test" -> {}
c -> {}
else -> {}
}
七、相等性
(1)==值相等
(2)===引用相同
(3)对于Int、Double、Long、Short、Byte、String,===和==值相同
八、函数(参数也可以是函数)
fun test(toNext: (result: String) -> Unit){
}
九、类
(1)主构造函数(如无注解或可见性修饰,constructor可省略)
class Person constructor(name: String){}
(2)次构造函数
class Person{
constructor(name: String){}
}
(3)init代码块
class Person{
init {}
}
(4)执行顺序:主构造函数--》init--》次构造函数
十、open(被open修饰的类才可以继承,被open修饰的方法才可以重写)
十一、this表达式
class A{
fun testA() {}
//inner定义内部类关键字
inner class B {
fun test() {
//内部类调用外部类方法需要@外部类
this.@A.testA()
}
}
}
十二、数据类(自动给我们提供了getter、setter、equals、hashCode、toString、copy方法)
data class Test(val t: String)
注:反序列化不支持默认值
1、fastjson对于默认值情况会报异常
//需要添加org.jetbrains.kotlin:kotlin-reflect依赖
val str = "{\"strOne\":\"11\"}"
val test = JSON.parseObject(str, Test::class.java)
data class Test (val strOne: String, val strTwo: String = "aa"): Serializable
2、gson不会报异常但无法获取到默认值,为null
val str = "{\"strOne\":\"11\"}"
val test = Gson().fromJson(str, Test::class.java)
data class Test (val strOne: String, val strTwo: String = "aa"): Serializable
十三、扩展(如在文件根位置定义扩展则全局可用;如在class中定义扩展则只能在该类中使用)
1、扩展函数
fun Context.toast(text: String){
Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}
2、扩展属性
var Context.test: String
get() = this.test
set(value) {
this.test = value
}
十四、委托
1、函数委托
interface A{
fun print()
}
class AA : A{
override fun print() {
Log.v("aa", "这是AA")
}
}
class AAA(aa: AA): A by aa //将AAA的print()委托给aa
AAA(AA()).print() //输入“这是AA”
2、属性委托
(1)by lazy懒加载
/*
* mode共三种模式
* (1)LazyThreadSafetyMode.SYNCHRONIZED(默认)多线程同步
* (2)LazyThreadSafetyMode.PUBLICATION 哪个线程先获取值就用该值
* (3)LazyThreadSafetyMode.NONE 没有线程同步,线程不安全
*/
val str: String by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) { "这是 by lazy" }
(2)by Delegates.observable观察者模式
//之后每次对str赋值都会调用这里的方法(即使oldValue与newValue一样)
var str: String by Delegates.observable("初始值") { property, oldValue, newValue ->
Log.v("aa", "******$oldValue $newValue")
}
十五、"""(字符串所见即所得,支持多行、包含"无需转义)
val aa = """
你想测试一下什么?
测试多行和""
哈哈看结果吧
"""
十六、use函数,自动close功能,如下无需bufferReadable.close()
fun readFile(file: File): String{
val bufferReadable = file.bufferedReader()
bufferReadable.use {
return it.readLine()
}
return ""
}