侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 274 篇文章
  • 累计创建 55 个标签
  • 累计收到 74 条评论

Kotlin 进阶 object关键字介绍与学习

Z同学
2022-03-03 / 0 评论 / 3 点赞 / 132 阅读 / 3,198 字
温馨提示:
本文最后更新于 2022-03-03,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

Kotlinobject是一个特殊的关键字。主要用于声明一个类的同时创建这个类的对象(例如单例)。

在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中的使用。

3

评论区