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

你可能感兴趣的:(kontlin学习,kotlin)