Kotlin学习---伴生对象

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中调用静态属性和静态方法
  • 伴生对象可以扩展属性和扩展方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值