kotlin 类和对象

2022-11-09  本文已影响0人  Bfmall

一、类的继承

/**
 * 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==>")
    }
}
上一篇下一篇

猜你喜欢

热点阅读