类的继承

0 阅读2分钟

一.继承的概念和基本语法

  • 1.定义:在原有类的基础上定义一个新类,原有类称为父类,新类称为子类。

  • 2.作用:复用代码和实现多态

  • 3.(复用代码:子类可以继承父类的特性。"多态":子类可以在自己内部实现父类没有的特性。class 子类名 extends 父类名 { 类体 })

object class02 {
  class Boss {
    def power(): Unit = {
      println("Boss 有权力")
    }
    var car = "豪车"  // 将 car 移到 Boss 类内部,作为类的成员
  }

  class Nobody extends Boss {  // 继承 Boss 后,自动拥有 car 成员
  }

  def main(args: Array[String]): Unit = {
    val b = new Nobody()
    println(b.car)  // 现在可以访问,输出:豪车
    b.power()       // 输出:Boss 有权力
  }
}

(二).继承的方法重写

  • 1.当子类从父类继承的方法不能满足需要时,子类需要有自己的行为,使用 override 可以重写父类的方法
  • 2.重写:子类对父类同名方法进行重写
package level02

object Class11 {
  class Boss {
    def test(): Unit = {}
    def power(): Unit = {
      println("Boss 有权力...")
    }
    var car = "豪车"
  }

  // 子类 Nobody 内部重写父类方法
  class Nobody extends Boss {
    def run(): Unit = {}

    // 正确:在子类内部重写父类的 power 方法
    override def power(): Unit = {
      println("老莫,我要吃鱼了")
    }
  }

  def main(args: Array[String]): Unit = {
    val b = new Nobody()
    println(b.car)  // 输出:豪车(继承自 Boss 的 car 变量)
    b.power()       // 输出:老莫,我要吃鱼了(调用重写后的方法)
    b.run()         // 调用子类自己的 run 方法(无输出)
  }
}

(三).构造器的调用顺序

父类和子类的构造器调用顺序:先调用父类构造器,再调用子类构造器

(四).带参构造器的写法

  • 1.子类构造器:继承父类的属性,不用写val,var修饰符;weight需要添加var,它是子类的自己的属性
  • 2.父类构造器:直接带参数,不用写属性的类型
  • 3.带参构造器:相对父类,子类有新的构造器
object class13 {
  // 父类
  class Dog(var name: String, var age: Int) {
    println(s"Dog ${name}, ${age} 构造器被调用")
  }

  // 子类 中华田园犬
  class RuralDog(name: String, age: Int,var color:String) extends Dog(name, age) {
    println(s"RuralDog 的构造器...${color}")
  }

  def main(args: Array[String]): Unit = {
    new RuralDog("旺财", 3,"土黄色")
  }
}