类的进阶

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基本类型上

你可能感兴趣的:(类的进阶)