kotlin 类 继承
注意
类型检测类型转换超类 kotlin object 关键字
对象声明对象表达式伴生对象 kotlin 类 继承
一个类默认是final 的 不能被继承 除非使用open关键字 方法也是如此 只有用open 修饰 才能被重载。
eg
open class a(val S:String){open fun load()}//子类拥有构造函数b (val s:String,val v:String) :a(s){fun special()}
除了open关键字,还需注意,子类必须super调用父类构造方法(除非父类没有含参数的构造方法)。kotlin继承时如果子类有主构造函数,那么必须在后面super父类构造方法。若子类没有主构造函数,那么在次构造函数处super调用父类构造方法
eg
open class a(val S:String){open fun load()}//子类没有主构造函数b :a{constructor(val d:String,val e:String):super(d){}fun special()}
注意 类型检测 is关键字
eg bb is a
相当于 JAVA instanof
as 关键字
上例
test:a=b() 类型为父类的 a
test.special 是不行的
需要 (test as b) .special()
kotlin 智能类型转换
只用 as 转一次 后面就能一直使用 test.special()
java 的话 必须每次都as 除非一个变量来接受转换后的对象
any类 kotlin的所有类的超类 java的超类是object。
kotlin跨平台特性 使得any类里面 tostring,hashcode 这些方法没有具体实现 代码看不到 而是根据平台特性 来内部实现的(存在,但我们看不到)
定义一个 只能产生一个实例的类-单例
三种使用方式 :
对象声明
对象表达式
伴生对象
单例:不浪费资源,用来加载文件,数据库,保存配置,方便管理状态
kotlin没有静态方法
使用 object appconfig{
fun a()
}
kotlin中使用对象声明,产生的是一个简单的单例(初始化是首次访问时,初始化过程线程安全),但是可以放一些配置属性,一些编号与字符串相互转换map,贯穿一个流程的对象 访客信息登记类等等
appconfig.a()。
总而言之,单例可以保存一些状态和常量。在java中,经常使用接口(属性默认都是static final的)来保存一些常量。
对象表达式关于静态类
https://www.jianshu.com/p/80b404da976b
关于静态类与单例
https://blog.csdn.net/sinat_20559947/article/details/48684015
关于单例
https://www.jianshu.com/p/bdaf68599bad
一些只用一次的类,那就名字都不用给它取了,匿名类,它是一个变体实例,就是继承父类或者接口(多数为接口),重载一些方法,只使用一次,用完就丢,没必要重新去写一个类,继承,然后使用new实例化 。保持object的特性 该匿名类只有一个实例(也只能有一个,因为他没有名字)
eg
open a(){fun ab}b (){val aa=object : a(){override fun ab}}
伴生对象如果想将某个对象的初始化和一个类捆绑在一起,就可以使用伴生对象 companion修饰,一个类只能有一个伴生对象。可以是一些配置,文件,资源加载类
eg class a(){companion object{属性 fun load()}}
可以直接使用 a.load
特点:无论创建多少个实例类,调用几次,伴生对象只有一个。
这里这其实就是java类里的 静态实现 (属性,方法)
但是比java类科学
只有被调用的时候,才会实例化。
伴生对象和对象声明的区别,其实就在于伴生,他的特性和所伴生的对象,是有关联的
写一些线程安全的单例,就会用到伴生对象。这样就和java的单例写法有点像,利用静态特性。虽然kotlin没有static关键字
而对象声明,就像一个独立的单例