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 关键字
定义一个 只能产生一个实例的类-单例 三种使用方式 : 对象声明 对象表达式 伴生对象
对象声明
单例:不浪费资源,用来加载文件,数据库,保存配置,方便管理状态 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关键字
而对象声明,就像一个独立的单例
|