Scala中的继承

91 阅读2分钟

在 Scala 中,继承是面向对象编程的核心机制,通过 extends 关键字实现类的继承关系,子类可复用父类的属性与方法,同时借助 override 关键字重写父类逻辑以实现个性化功能。

extends 让子类 “继承” 父类的非私有成员,例如定义父类 Animal 包含 eating 方法,子类 Dog 可直接调用该方法。而当子类需修改父类行为时,override 就派上用场,如 Dog 类重写 eating 方法,输出 “狗大口进食” 的特有逻辑,且重写时还可通过 super 调用父类原方法。

这种机制还能实现多态:父类引用可指向子类实例,调用方法时动态执行子类的重写逻辑。例如定义接收 Animal 类型参数的 test 函数,传入 Dog 实例时,会执行 Dog 类的 eating 方法。继承结合 extends 和 override,既减少了代码冗余,又让类的层次结构更清晰,是构建可扩展、可维护 Scala 应用的重要基石。

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

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

 //子类:name,age,color
 class Dog(name:String, age:Int, var calor:String) extends  Animal(name,age) {

 }

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

Snipaste_2025-11-10_14-58-31.png

案例1.

Snipaste_2025-11-10_15-06-32.png

代码如下:

package A2
class Point(val x: Double, val y: Double) {
 // 方法1:判断所在象限
 def whereAmI(): String = {
  if (x > 0 && y > 0) "第一象限"
  else if (x < 0 && y > 0) "第二象限"
  else if (x < 0 && y < 0) "第三象限"
  else if (x > 0 && y < 0) "第四象限"
  else if (x == 0 && y == 0) "原点"
  else if (x == 0) "y轴上"
  else "x轴上"
 }

 // 方法2:计算到原点的距离
 def getDist(): Double = math.sqrt(x * x + y * y)

 // 方法3:计算与另一个点的距离
 def fromPoint(other: Point): Double = {
  val dx = x - other.x
  val dy = y - other.y
  math.sqrt(dx * dx + dy * dy)
 }

 // 方法4:重写equals判断是否为同一个点
 override def equals(obj: Any): Boolean = {
  obj match {
   case p: Point => p.x == x && p.y == y
   case _ => false
  }
 }

 // 方法5:重写toString友好输出点信息
 override def toString: String = s"Point($x, $y)"
}

// 子类LabelPoint,继承Point并添加标签属性
class LabelPoint(label: String, x: Double, y: Double) extends Point(x, y) {
 override def toString: String = s"LabelPoint($label, $x, $y)"
}

// 测试示例
object PointTest {
 def main(args: Array[String]): Unit = {
  val p1 = new Point(3, 4)
  println(p1.whereAmI())       // 第一象限
  println(p1.getDist())        // 5.0
  val p2 = new Point(0, 0)
  println(p1.fromPoint(p2))    // 5.0
  println(p1 == new Point(3, 4)) // true
  println(p1)                  // Point(3.0, 4.0)

  val lp = new LabelPoint("black", 1, 2)
  println(lp)                  // LabelPoint(black, 1.0, 2.0)
 }
}