Kotlin学习—伴生对象
写在前面:写这篇文章是因为自己在开发中踩到了坑,故学习并记录
companion object
comanion object:为伴生对象,伴生对象在每个类中只存在一个,类似java中的静态(static)
例子:
class BiaoCompantion{
compantion object BiaoObj{
var flag = false
fun biao(a:Int,b:Int):Int{
retrun a+b
}
}
}
调用:
BiaoCompantion.flag
BiaoCompantion.biao(1,1)
作用:
由上面例子调用的代码可以看出,上面写法类似Java中使用类访问静态成员的语法。kotlin取消了static关键字,所以kotlin使用伴生对象(compantion object)来弥补没有静态成员的不足。
与Java代码共存(getter和setter可以不用写,会默认实现):
- 如果声明伴生对象有名称则:
类名.伴生对象名.方法名()
类名.半生对象名.属性的setter,getter方法
BiaoCompantion.BiaoObj.getFlag
- 如果声明伴生对象无名称,则采用compantion调用
类名.Companion.方法名()
类名.Companion.属性的setter,getter方法
BiaoCompantion.Companion.getFlag
const关键字
在伴生对象中,有时候会需要声明一个常量,等同与Java中的静态常量。两种方式1、`@JvmField`注解,2用const关键字,这两种声明方式都等同于Java中的static final所修饰的常量,如:
compantion BiaoConst{
const val a = 2
@JvmFiekd
val b = 3
}
调用:
BiaoCompantion.a
BiaoCompantion.b
而以上const关键字是使用的影响只是在Java中调用方式不同,在kotlin中并无影响
伴生对象的扩展
在kotlin中的对象是可以被扩展的,如果类中包含伴生对象,则kotlin允许伴生对象扩展方法和属性,也就是为伴生对象所在的外部类扩展静态成员,访问方式一致
扩展方法
fun BiaoCompantion.Companion.changeInt(str:String):Int{
if(str.isNotEmpty()){
return str.toInt()
}else{
return 0
}
}
通过上面例子可以看出,通过类名去扩展方法,如果伴生对象有名称的话,使用BiaoCompantion.BiaoObj.方法名来扩展,否则使用BiaoCompantion.Companion.方法名来扩展
扩展属性
var BiaoCompantion.Companion.num
get() = field
set(value){
if(value > field){
return value
}else{
retuen field
}
}
var BiaoCompantion.Companion.str
get()="这是一个扩展属性"
总结
- 每个类中至多有一个伴生对象
- 伴生对象的成员类似于Java的静态成员
- 使用const关键字修饰常量,类似于Java中的static final修饰
- 可以使用@JvmFieil和@JvmStatic类似于Java中调用静态属性和静态方法
- 伴生对象可以扩展属性和扩展方法