在 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()
}
案例1.
代码如下:
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)
}
}