Scala类的继承

76 阅读1分钟

1.父类子类的概念

以代码为例

  • 父类 Animal:定义了一个动物类,包含两个参数(同时作为成员变量):
  1. val name: String:不可变属性(只读),表示动物的名字;
  2. var age: Int:可变属性(可读写),表示动物的年龄。类中包含:
  3. 构造器:创建实例时会执行打印语句 println(s"父类构造器.....${name} ${age}")
  4. 方法 eat():打印动物进食的信息。
  • 子类 Dog:定义了一个狗类,继承自父类 Animal(通过 extends 关键字实现继承),新增了一个可变属性 var color: String(表示狗的颜色)。子类的构造器参数为 (name: String, age: Int, var color: String),其中前两个参数 name 和 age 会传递给父类的构造器(通过 extends Animal(name, age) 实现)。类中包含子类构造器的打印语句:println(s"子类构造器.....${name} ${age} ${color}")

  • 主方法 main:程序入口,创建 Dog 类的实例 dog1(参数为 "旺财"、1、"黑色"),并调用继承自父类的 eat() 方法。

2. 核心逻辑与执行流程

  1. 创建子类实例时的构造器调用顺序:在 Scala 中,创建子类实例时,会先执行父类的构造器,再执行子类的构造器。下例中,new Dog("旺财", 1, "黑色") 会先调用父类 Animal 的构造器(传入 "旺财" 和 1),打印 父类构造器.....旺财 1;然后执行子类 Dog 的构造器,打印 子类构造器.....旺财 1 黑色
  2. 继承的特性:子类 Dog 继承了父类 Animal 的所有非私有成员(包括属性 nameage 和方法 eat()),因此可以直接通过子类实例 dog1 调用 eat() 方法。调用 dog1.eat() 时,会使用父类的 name 和 age 属性,打印 旺财 1 eating....

3.下面是整体代码

// 父类: name, age
  class Animal(val name:String, var age:Int) {
    println(s"父类构造器.....${name} ${age}")

    def eat():Unit = {
      println(s"${name} ${age} eating....")
    }
  }

  // 子类: name, age, color
  class Dog(name:String, age:Int, var color:String) extends Animal(name, age) {
    println(s"子类构造器.....${name} ${age} ${color}")
  }

  def main(args: Array[String]): Unit = {
    val dog1 = new Dog("旺财", 1, "黑色")
    dog1.eat()
  }

总结

这段代码通过 extends 关键字实现了类的继承,体现了面向对象编程中 “子类复用父类代码” 的特性,同时展示了父子类构造器的执行顺序。子类可以继承父类的属性和方法,也可以扩展自己的属性。