美文网首页
kotlin 类和对象

kotlin 类和对象

作者: Bfmall | 来源:发表于2022-11-09 17:56 被阅读0次

    一、类的继承

    /**
     * DESC   :
     * 1.继承与重写,open关键字
     * 2.超类Any,Kt中所有的类都默认集成自Any,你不写,默认就有
     */
    
    open class KtBaseObjectTest /*: Any()*/ {
    
        companion object {
            const val TAG = "KtBaseObjectTest"
        }
    
        //如果父类方法没有open关键字,子类不可重写此方法
        fun showName() {
            Log.d(TAG, "showName==>父类方法")
        }
    
        /**
         * KT所有的方法都是final类型的,不能被重写,除非加上open关键字(背后原理就是将final关键字去除了)
         * 这一点跟java相反,java是默认可以被重写
         */
        open fun showInfo() {
            Log.d(TAG, "showInfo==>父类方法")
        }
    
        private fun method1() {
            Log.d(TAG, "method1=父类方法")
        }
    }
    
    class KtBaseObjectTest01 : KtBaseObjectTest() {
    
        /**
         * 因父类存在同名方法showName,但不是open类型,不能重写
         * 如要重写,父类的showName需要加上open关键字才行
         */
        /*fun showName() {
    
        }*/
    
        /**
         * 重写父类方法
         */
        override fun showInfo() {
            Log.d(TAG, "showInfo==>子类方法")
        }
    
    
        /**
         * 和父类同名方法,因为父类设置为private,不冲突
         */
        private fun method1() {
            Log.d(TAG, "method1=父类方法")
        }
    
        fun testOpen01() {
    
            //showInfo==>父类方法
            KtBaseObjectTest().showInfo()
    
            //showInfo==>子类方法
            showInfo()
        }
    }
    

    二、object修饰的类为单例对象

    /**
     * DESC   : object修饰的类为单例对象
     */
    class KtBaseObjectTest02 {
    
        companion object {
            const val TAG = "KtBaseObjectTest02"
        }
    
        fun testManagerTest() {
            /**
             * 打印ManagerTest对象的名字,可以看到,每次都一样,说明object修饰的类为单例
             * testManagerTest==>打印对象名字:com.xyaty.kotlinbasedemo.base05.ManagerTest@9381bfb
             * testManagerTest==>打印对象名字:com.xyaty.kotlinbasedemo.base05.ManagerTest@9381bfb
             * testManagerTest==>打印对象名字:com.xyaty.kotlinbasedemo.base05.ManagerTest@9381bfb
             * testManagerTest==>打印对象名字:com.xyaty.kotlinbasedemo.base05.ManagerTest@9381bfb
             *
             *
             * 背后的逻辑代码:
             *  public static final ManagerTest INSTANCE;
             *  private ManagerTest() {
             *  }
             *
             *  static {
             *      ManagerTest var0 = new ManagerTest();
             *      INSTANCE = var0;
             *  }
             *
             *  可以看到在static静态代码块中创建了一次ManagerTest对象,而static静态代码块只会调用一次
             */
            Log.d(TAG, "testManagerTest==>打印对象名字:"+ManagerTest)//背后代码相当于ManagerTest.INSTANCE
            Log.d(TAG, "testManagerTest==>打印对象名字:"+ManagerTest)//相当于ManagerTest.INSTANCE
            Log.d(TAG, "testManagerTest==>打印对象名字:"+ManagerTest)//相当于ManagerTest.INSTANCE
            Log.d(TAG, "testManagerTest==>打印对象名字:"+ManagerTest)//相当于ManagerTest.INSTANCE
    
            //背后代码:ManagerTest.INSTANCE.getManagerInfo();
            ManagerTest.getManagerInfo()
        }
    }
    
    /**
     * object对象说明:
     * object ManagerTest既是单例类的实例,也是类名,只不过object修饰的为单例对象
     */
    object ManagerTest {
        const val TAG = "ManagerTest"
    
        init {
            Log.d(TAG, "ManagerTest init==>")
        }
    
        fun getManagerInfo() {
            Log.d(TAG, "getManagerInfo==>")
        }
    }
    

    相关文章

      网友评论

          本文标题:kotlin 类和对象

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