美文网首页
kotlin-object关键字

kotlin-object关键字

作者: Method | 来源:发表于2021-10-21 17:36 被阅读0次

    [toc]

    对象声明

      object修饰的类与普通类的区别是里边包含一个单例。我也不知道为什么都叫对象声明。
    

    源码解析

    object UserManager {
        var age = 1
        fun saveUser()
    }
    
    // 反编译出的Java代码
    public final class UserManager {
       public static final UserManager INSTANCE;
    
       public final void saveUser() {
       }
    
       private UserManager() {
       }
    
       static {
          UserManager var0 = new UserManager();
          INSTANCE = var0;
       }
    }
    

    类对象声明及类成员调用

    fun main(args: Array<String>) {
        val p1 = UserManager
        val p2 = UserManager
        println("p1==p2--> ".plus(p1 == p2))
        p1.apply {
            println(this)
            age++
        }
        p2.apply {
            println(this)
            println(age)
        }
    }
    

    打印结果可以看出是同一个对象

    p1==p2--> true
    com.kotlin.login_apiresult.object.UserManager@6f94fa3e
    com.kotlin.login_apiresult.object.UserManager@6f94fa3e
    2
    

    伴生对象(companion object)

    简单理解就是kotlin不支持static,companion object可以模仿static效果

    直接看源码解析

    class App {
        companion object {
            fun getAppContext() {}
        }
    }
    
    // 反编译出的Java代码
    public final class App {
       public static final App.Companion Companion = new App.Companion((DefaultConstructorMarker)null);
    
       public static final class Companion {
          public final void getAppContext() {
          }
    
          private Companion() {
          }
    
          // $FF: synthetic method
          public Companion(DefaultConstructorMarker $constructor_marker) {
             this();
          }
       }
    }
    

    声明:

    class NumberTest {
        companion object Obj {  
            var flag = false
    
            fun plus(num1: Int, num2: Int): Int {
                return num1 + num2
            }
        }
    }
    

    调用

    fun main(args: Array<String>) {
    
        println(NumberTest.plus(1, 2))  // 3
        println(NumberTest.flag)  // false
    
    }
    

    静态常量(用的挺多)

    在伴生对象中,我们可能需要声明一个常量,目的是等同于 Java 中的静态常量。有两种方式,一种是上面所提到的使用 @JvmField 注解,另一种则是使用 const 关键字修饰。这两种声明方式都等同于 Java 中 static final 所修饰的变量。如下代码:

    companion object {
          const val m = 2
    
          @JvmField
          val n = 3
    }
    
    // java 代码中调用:
    System.out.println(NumberTest.m);
    System.out.println(NumberTest.n);
    

    扩展属性(很少用)

    var NumberTest.Companion.number
        get() = 3
        set(value) {
            // set 方法并没有 field 可以用来存储 value
            this.plus(value, 2)
        }
    
    val NumberTest.Companion.str
        get() = "这是一个扩展属性"
    

    单例(用的挺多)

    class Person{
        val age = 1
        companion object{
            val instance by lazy {
                Person()
            }
        }
    }
    

    对象表达式

    我也不知道为啥叫对象表达式,用的最多的地方就是匿名内部类,不过有了高阶函数感觉用的地方也不多

    private val callBack = object : CallBack {
    
        override fun onSuccess() {}
    
        override fun onFailure() {}
    }
    
    // 通过对象表达式实现点击事件回调
    btn.setOnClickListener(object : View.OnClickListener {
        override fun onClick(v: View) {
            TODO("Not yet implemented")
        }
    })
    

    相关文章

      网友评论

          本文标题:kotlin-object关键字

          本文链接:https://www.haomeiwen.com/subject/mgtqaltx.html