类的成员:
(1). 构造函数和初始化代码块
(2). 属性
(3). 函数
(4). 嵌套类和内部类
(5). 对象的声明
- 继承 在KT中所有的类都有一个共同的超类 Any 这对于没有超类声明的类是默认超类 也就是说隐式继承
class Father: Any()
而KT Any只有三个函数 equeals() hashCode() toString() 如果想要使用Java中的Object的其它成员:
- 可以扩展函数
- 也可以强转Object
fun main() {
var father = Father()
(father as Object).wait(1000)
}
class Father: Any()
fun main() {
var father = Father()
// wait()/notify()
(father as Object).wait(1000)
(father as Object).notify()
// getClass() 获取对象的java类
father.javaClass
father::class.java
// clone() 覆盖方法clone() 需要继承Cloneable() 谨慎修改clone()
Son()
// finalize() 覆盖 只需要简单的声明就好 不需要override关键字
}
class Father : Any()
class Son : Cloneable {
override fun clone(): Any {
return super.clone()
}
}
class A{
// java规则 finalize() 不能是private的
protected fun finalize() {
// 终止化逻辑
}
}
上节我们简单介绍了继承,那么我们在此说一下super关键字 调用父类的成员变量和和成员方法
super.成员变量
super.成员方法
如果子类重写父类的方法 完全重写 就不要super 可以在子类重写的方法中干自己想要的事情
抽象类
- 抽象和继承有异曲同工之妙 不是完全一样
- 定义一些类的时候 往往是需要定义一些方法来描述该类的行为特征 但有时候这些方法的实现方式是无法确定的(什么是无法确定? 也就是说我定义两种动物 一种小狗 另一种小猫 它们都有吃的这个动作行为 那么它们喜欢吃的东西可能就不一样) 此时就可以将其定义为抽象方法 抽象方法没有方法体 只有在需要它的地方实现其方法体
- 当一个类中包含了抽象方法 那么这个类必须是抽象类 用abstrct关键字修饰
abstract class An {
// 抽象函数没有方法体
abstract fun eat()
abstract fun work()
fun runTo() {
// 普通函数
}
}
- 抽象类中的方法可以是抽象的、也可以是非抽象的、也可以都是非抽象的
- 抽象类是不能被实例化的 因为抽象类中可能包含抽象方法 抽象方法又都是没有方法体的 不可以被调用
- 抽象类被继承 直接可以在子类中实现抽象类中的方法
- abstract修饰的类(抽象类)可以直接被继承 不需要open关键字修饰为可继承 也就是默认能被继承
接口
- 和抽象类相似 但是抽象类中有抽象和非抽象的函数 如果一个抽象类中的函数都是抽象的 那么也可以用接口进行表示 所以说接口中的函数都是抽象的 一个类中所有的函数都是抽象的 那它不一定是抽象类
- 接口中的函数都不能被实现的 接口需要interface关键字修饰 其函数默认是abstract
- 接口可以多实现 接口之间可以相互继承
- 一个类在继承另一个类的同时还可以实现接口 继承的类和实现的接口都可以放在(:)冒号后面
网友评论