Object表达式&声明


Object 表达式

主要是匿名实现接口,,如果构造函数需要传参也可以传入

下面实现一个存在的接口

fun BaseMain() {

    var des = object : IDecription {
        override fun description() {
            println("This is an anonymous implement.Please wait you teacher to come.")
        }
    }
    des.description()
}

interface IDecription {
    fun description()
}
  • 直接创建

临时使用object,造一个

   var ob = object {
        var name = "NieBin"
        var age = 29
    }
    ob.age = 20
    println("ob=$ob and name is ${ob.name} ,age is ${ob.age}")
  • 只能用在private 和location 声明,不能用在public ,使用后也不能访问
fun BaseMain() {
    privObj().x//可以调用
    pubObj().x//直接编辑错误

}


fun pubObj() = object {
    var x = 10
}

private fun privObj() = object {
    var x = 10
}
  • 调用外部参数

匿名内部类,调用外部参数,不会像java一样需要final 类型,kotlin中只要一般变量就可以调用,并且只有调用的时候才去读取值

 fun BaseMain() {

        var x = 0
        var y = 0
        var function = object : INoFinal {
            override fun callFun() {
                println("This is callFun funtion, I print the follow content: x = $x and y = $y")
            }

        }
        println("first......")
        function.callFun()
        println("change the x,y")
        x = 3;y = 9
        function.callFun()
    }

    interface INoFinal {
        fun callFun()
    }
    /**打印
first......
This is callFun funtion, I print the follow content: x = 0 and y = 0
change the x,y
This is callFun funtion, I print the follow content: x = 3 and y = 9
    */

Object声明

  • 单例模式

定义后,不需要实例化,直接调用名称,就像java中的类调用静态方法一样,灰常方便的不是吗!

这里的Log就是单例的,并且是线程安全的

并且可以继承于某个类,这里略,自己写写

fun BaseMain() {
    Log.log("GOOGOGO", "This is the firt log I had say.")

}

object Log {
    fun log(tag: String, content: String) {
        println("$tag: $content")
    }
}

Companion Object 友员对象

在kotlin中没有,静态方法的概念,如果想通过类直接调用方法,就需要实现Companion Object-

一个类中只能允许一个companion object 哟

  • 带名字

命名规则和一般的类一样

调用时,可以直接调用,也可以通过Object name来调用 ,实现如下 都是合法的调用

fun BaseMain() {
    Robot.x
    Robot.StaticFunction.x
    Robot.running()
    Robot.StaticFunction.running()
}

class Robot {
    companion object StaticFunction {
        var x = 1
        fun running() {
            println("This robot is running,please run with her and ask some special question!")
        }
    }
}
  • 省略名字

声明时,不带名字,只有关键字,请往下看

可以发现,和带名字的调用方式是一样的,只是将object名字默认设置为Companion而已

fun BaseMain() {
    Animal.yellLoad()
    Animal.Companion.yellLoad()
}


class Animal {
    companion object {
        fun yellLoad() {
            println("There is some thing horrible, the animal nearby are all yelling aloadly with each other.")
        }
    }
}

注意:虽然调用是和静态的一样,实际上却是对象的调用

results matching ""

    No results matching ""