类的继承与多态

28 阅读1分钟

继承

extends

好处:不劳而获

如何解决子类觉得父类的方法不是自己要的?

1.override 重写

2.super 在子类内部,通过super来访问父类

案例

  class Animal() {
    def eating():Unit={
      println("Animal eating")
    }
  }
  class Dog extends Animal(){ // Dog 继承了 Animal
    //覆盖 → 解决子类觉得父类的方法不是自己要的
    override def eating():Unit ={
    println("小狗有自己的吃饭方式") // 在子类中重写(覆盖)父类的方法
    }

  }
  def main(args:Array[String]):Unit ={
    val dog1 = new Dog()
    dog1.eating() // 直接可以使用父类的方法
  }

多态

多态:同一个操作,作用于不同的对象,有不同的执行结果

案例

  class Animal() {
    def eating():Unit={
      println("Animal eating")
    }
  }
  class Dog extends Animal(){ // Dog 继承了 Animal
    //覆盖 → 解决子类觉得父类的方法不是自己要的
    override def eating():Unit ={
    println("小狗有自己的吃饭方式") // 在子类中重写(覆盖)父类的方法
    }
  }
  //Cat 继承了Animal
  class Cat extends Animal(){ // Dog 继承了 Animal
    //覆盖 → 解决子类觉得父类的方法不是自己要的
    override def eating():Unit ={
      println("小猫有自己的吃饭方式") // 在子类中重写(覆盖)父类的方法
    }
  }
  // 测试函数
  // 他的函数是 父类
  def test(animal: Animal): Unit = {
    animal.eating()
  }
  def main(args:Array[String]):Unit ={
    val cat = new Cat()
    val dog = new Dog()
   //   ↓ 传入子类的对象
    test(cat)
    test(dog)
  }

构造器

存在继承关系的时候,构造器的调用顺序: 父类构造器 → 子类构造器

案例

class Animal() {
 println("父类构造器被调用......")
}
class Dog extends Animal(){ // Dog 继承了 Animal
 println("子类构造器被调用.....")
}
// puppy 继承了 DOG
class Puppy extends Dog(){
 println("子类:Puppy 构造器被调用......")
}
def main(args:Array[String]):Unit ={
 new Puppy()
}