一、类的继承
/**
* 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==>")
}
}
网友评论