1.继承
需要被继承的类,类的方法,类的属性都要加open关键字
// 父类没有构造需要的参数
open class Person(){
var name:String = ""
var age:Int = 0
}
class Student():Person(){
var school:String = ""
}
// 父类有需要构造的参数
open class Person(var name:String, var age:Int){
open fun showInfo(){
print("hello")
}
}
class Student(var name:String, var age:Int, var school:String):Person(name, age){
override fun showInfo(){
print("hello student")
}
}
2.抽象类 重写 重载
抽象类不能被实例化,需要子类去继承然后实现抽象方法,所以也不需要加open关键字
abstract class News{
var origin = "reporter"
abstract var content:String
abstract fun newsLength(): Int
}
class schoolNews:News(){
override var content:String =""
override fun newsLength():Int = content.length
}
重载:不同参数个数的重载
重写:子类继承父类,重写父类的方法
3.接口interface
接口也不需要加open关键字
interface USB{
fun add()
fun remove()
}
class Computer:USB{
override fun add(){
print("add")
}
override fun remove(){
print("remove")
}
}
补充
属性代理
// 属性代理就是将属性的get set都转移到定义的by后面的类里面
// 如果属性val需要实现一个操作符getValue()方法,如果属性是var的话,就要实现getValue()和setValue()方法
class delegates{
val name by lazy{
"minger"
}
}
// lazy 和 lateinit都是延迟初始化
// lazy只能用在val上,lateinit只能用在var上
// lateinit不能用在可空类型和java基本类型上