介绍
在Kotlin
中object
是一个特殊的关键字。主要用于声明一个类的同时创建这个类的对象(例如单例)。
在Kotlin中它有三个方面的应用:对象表达式,对象声明和伴生对象。
下面就来一点点介绍object
关键字的特性和使用。
对象表达式
object
关键字可以声明对象表达式,用来代替Java
中的匿名内部类。所谓的对象表达式就是声明一个匿名类的同时创建这个匿名类的对象。
示例:
//声明一个类
class Zinyan{
//我们定义一个测试函数
fun test(listener: OnClickZinyan){
listener.onClick()
}
}
//创建一个接口
interface OnClickZinyan{
fun onClick()
}
fun main(args:Array<String>){
var i= 2022
var j= Zinyan()
//下面使用Object关键字创建对象表达式
j.test(object:OnClickZinyan{
override fun onClick(){
//我们自定义接口的处理逻辑
}
})
}
在上面的示例中,我们的Zinyan
类的test
函数要传入的是一个接口对象。我们可以通过object
对象声明并实例一个匿名类。
这个地方我们需要掌握,因为在实际开发中我们会大量的使用这种方法声明和创建匿名类。
除了上面的实例化接口类,创建匿名类。我们还可以实例化抽象类并创建匿名类。
示例:
//声明一个抽象类
open class Zinyan(val name:String)
fun main(args:Array<String>){
//声明继承一个抽象类的同时,也可以集成一个接口对象
var zin = object:Zinyan("Z同学"),OnClickListener{
override fun onClick(){
//我们来实现点击接口对象
}
override fun toString():String{
//我们重构类的toString 函数
return name
}
}
}
这种是实现了对象表达式。还有一种情况,就是我们完全没有类对象的引用的情况下。
我们在函数当场创建一个匿名类。示例:
fun main(args:Array<String>){
//我们直接创建一个匿名类对象出来参与业务流程处理
var zinyan = object{
var name:String = "Z同学"
var url:String="zinyan.com"
override fun toString():String{
return "网址:$url ,-网名:$name"
}
}
//然后我们就可以使用zinyan对象并打印上面的结果了。
}
对象声明
我们使用对象声明更多的是单例对象的使用,在Kotlin
中把单例设计模式上升到了语法层面。也就是说有专门的单例对象的语法写作。这样相较于java
中每次需要自己创建单例对象的引用等,Kotlin
中使用要方便很多。
当然了,前提是我们能够弄明白Kotlin
的单例语法。
//创建一个接口
interface OnZinyan{
//获取url地址
fun getUrl():String
//获取一个名称
fun getName():String
}
//对象声明一个OnZinyan的单例对象
object Zinyan:OnZinyan{
private var name:String ="Z同学"
override fun getName():String{
return name
}
override fun getUrl():String{
return "zinyan.com"
}
}
fun main(args:Array<String>){
var url =Zinyan.getUrl() //使用单例对象
var name= Zinyan.getName()
}
对象声明不能嵌套在其他函数中,但是可以嵌套在其他类或其他对象声明中。
也就是说不能写在某个函数的函数块中。
伴生对象
在java
中类有实例对象和静态对象(static
关键字标注的)。实例对象只有这个类本身的实例才会存在,而静态对象隶属于这个类本身。不管这个类有没有实例化我们都能够得到静态对象。
而Kotlin
中是没有static
关键字的,它需要通过声明伴生对象实现类似java
的静态对象的创建和访问。
这也是我们要讲的object
关键字的第三个作用,创建伴生对象。示例:
class Demo{
var name = "zinyan"
var url ="zinyan.com"
fun test(){
println(name) //简单的测试
}
//创建Demo 类的伴生对象
companion object{
//静态属性
var number = 2022
//静态函数
fun getNewNumber(num:Int):Int{
return number+num
}
//静态代码块
init{
println("静态代码块初始化...")
number = 2023
}
}
}
fun main(args:Array<String>){
val url =Demo() //使用单例对象
//我们直接访问伴生对象
println(Demo.number)
println(Demo.getNewNumber(2023))
}
//输出
静态代码块初始化...
2023
4046
其中的init
静态块就类似我们在java
中创建的static{}
。然后伴生对象的访问权限和java
中的差不多。
伴生对象只能访问自己内部的属性和函数,不能访问容器类(上面示例中的就是Demo
类)的成员属性和函数。
但是容器类可以访问伴生对象的函数和属性。这个逻辑比较好理解。
在上面的示例中我们还可以扩展伴生对象,让伴生对象实现继承其他抽象类和接口的方式,扩展我们的伴生对象的功能
//创建一个接口
interface OnZinyan{
//获取url地址
fun getUrl():String
//获取一个名称
fun getName():String
}
class Demo{
var name = "zinyan"
var url ="zinyan.com"
fun test(){
println(name) //简单的测试
}
//创建Demo 类的伴生对象
companion object XXX :Date(),OnZinyan {
override fun getUrl():String{
return "这个是地址"
}
override fun getName():String{
return "这是个名字"
}
//静态属性
var number = 2022
//静态函数
fun getNewNumber(num:Int):Int{
return number+num
}
//静态代码块
init{
println("静态代码块初始化...")
number = 2023
}
}
}
fun main(args:Array<String>){
val url =Demo() //使用单例对象
//我们直接访问伴生对象
println(Demo.XXX.number)
println(Demo.getNewNumber(2023))
}
在这个示例中,object
后面的是XXX
是我们伴生对象的名称,然后跟着的就是继承Date
类和OnZinyan
接口的实现。
我们在实际使用中可以省略也可以加上这个伴生对象名称。
我们还可以针对伴生对象进行扩展函数的添加等等,这个方面的知识在后面学习中碰见了再进行介绍吧。
本篇就到此为止了。希望能够帮助大家比较清晰的理解object
对象在Kotlin
中的使用。
评论区