1、object 修饰的类为静态类。调用时可以 var name = Util.getName();
object Util {
fun getName(): String {
return BuildConfig.VERSION_NAME
}
}
companion object 修改的方法为静态方法。调用时可以var name = Util2.getName(); 同时静态变量也需要申明在companion object下
class Util2 {
companion object {
var test:String? = ""
fun getName(): String {
return BuildConfig.VERSION_NAME
}
}
}
2、var 与 val的区别:
var修饰的变量可以改变值,可以重新赋值。val是一个只读变量,类似java中的final,创建的时候需要被初始化,赋值后不能被改变。
3、kotlin中所有的类默认是final的,如果你需要这个类能够被继承,那么需要将该类修饰为“open”(注意不是public)
//这个类具有`open`属性,可以被其他类继承
open class People: Speakable{
//`open`的方法被实现和覆写,该方法也是`open`的
override fun say() {}
//`final`属性的方法,不可被覆写
fun sayHello() {}
//`open`属性的方法,可以被继承和覆写
open fun sayName() {}
}
kotlin中所有的参数默认是public的,而java中默认是private的,如果kotlin也像java一样写成private,那同样得定义一系列的set()/get(),不然在类外面无法通过对象获取属性。
kotlin: var fileName: String? = null
java: private String fileName;
4、kotlin中是没有三目运算符的说法的
java中的语法
条件判断语句 ? "结果为true" : "结果为false";
kotlin中的语法
if(条件判断语句) "结果为true" else "结果为false"
5、 ?:
kotlin中有 对象A ?: 对象B
的写法,?:的意思是当A为null时就返回B
6、关于可变数组
1、var cache1: MutableList<String> = ArrayList() 或
2、var cache2: MutableList<String> = mutableListOf("张三", "李四")
3、var cache3: MutableList<String> = arrayListOf<String>("张三", "李四")
mutableListOf()返回了一个ArrayList对象,从对比中可以看到,1无法初始化可变数组,而2和3可以初始化可变数组。1和3返回的是java的arrayList。
不可变数组
1、var cache1 = listOf<String>("张三", "李四")
2、var cache2 = listOfNotNull(cache1)
2接受任意类型的参数,它的作用是剔除为null的参数,剩下的不为空的数据组成一个list。1和2都是不可变数组,没有add方法。
7、vararg
可变参数
fun test(vararg params: String){}
功能等同于Java代码:
void test(String... params)
8、let、with、run、apply
let:一般使用:
object.let{
it.todo()//在函数体内使用it替代object对象去访问其公有的属性和方法
...
}
//另一种用途 判断object为null的操作
object?.let{//表示object不为null的条件下,才会去执行let函数体
it.todo()
}
with:一般使用:
with(object){
//todo
}
val user = User("Kotlin", 1, "1111111")
val result = with(user) {
println("my name is $name, I am $age years old, my phone number is $phoneNum")
1000
}
let和with看似差不多,实际上在使用场景上还是有一些差别的,let可以用来做判空操作,但是with不行,with可以直接访问实例的公有属性和方法,但是let必须要用it来操作,其返回值为函数块的最后一行或指定return表达式(比如这里result=1000)。
一般with可以在viewholder中获取itemData的值的时候使用。
run:一般使用:
object.run{
//todo
}
val user = User("Kotlin", 1, "1111111")
val result = user.run {
println("my name is $name, I am $age years old, my phone number is $phoneNum")
1000
}
通过代码可以看的出来,run结合了let和with两种使用特点,run既可以像let那样做判空处理,又可以像with那样直接使用对象的属性和方法。
apply:一般使用:
object.run{
//todo
}
val user = User("Kotlin", 1, "1111111")
val newUser= user.run {
name = "lisi"
age = 2
}
apply的使用类似run,但是apply返回的类型是当前使用的对象,可用在对对象的初始化中。
also:一般使用:
val obj1 = object.also{
it.todo()//在函数体内使用it替代object对象去访问其公有的属性和方法
...
}
also的使用跟let很像,不同的是also返回的是使用对象本身,一般用于多个扩展函数链式调用