在 Scala 编程中,抽象类是面向对象设计的重要工具。它像一个 “蓝图的蓝图”,自身不能直接创建对象,却能为子类定义规范、提供通用功能。
一、抽象类的核心特性
抽象类用 abstract 关键字修饰,它有两个关键特点:
- 不能直接实例化:比如我们定义的
ATCar抽象类,无法通过new ATCar()来创建对象。 - 可包含抽象方法:抽象方法只有声明(无函数体),必须由子类实现。同时,抽象类也可以包含有具体实现的 “普通方法”。
代码如下
package level02
/*
* 抽象类 abstract
* 1.一个抽象类,不能被new
* 一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父亲!
* 2.可以定义抽象方法,在子类中实现
*/
object class11 {
abstract class ATCar {
//抽象方法:没有具体的函数代码
def autoEn():Unit
//具体方法
def autoDrive () :Unit ={
println("具体方法,自动驾驶....")
}
}
//在子类中,一定要去实现父类的所有抽象方法
class SU7 extends ATCar {
//使用override去实现这个方法
override def autoEn(): Unit = {
println(s"采用小米独家的无线充电技术,停车就可以充电")
}
}
def main(args: Array[String]): Unit = {
// val car1 = new ATCar()
val SU = new SU7()
SU.autoDrive()
}
}
二、抽象类的 “双抽象” 能力:属性与方法的契约式约束
抽象类的核心价值在于 “只定义规范,不提供具体实现”,这种规范既可以是方法,也可以是属性:
- 抽象方法:仅声明方法签名,无函数体,强制子类实现具体逻辑。
- 抽象属性:仅声明属性的类型(无初始值),强制子类提供具体赋值。
package level02
/*
* 抽象类 abstract
* 1.一个抽象类,不能被new
* 一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父亲!
* 2.可以定义抽象方法,在子类中实现
*
* 3.一个抽象类中可以有:
* 1.具体属性 val name: String = "小米"
* 2.具体方法 def autoRun():Unit = {}
* 3.抽象属性 val name: String 没有具体值的属性。只有属性名和类型。它必须写在抽象类中
* 4.抽象方法 def autoRun():Unit
* 在子类中要有具体的实现
*/
object class12 { // 修正:添加大括号,将类和方法包含在object内
abstract class ATCar() {
val name: String
def autoRun():Unit
}
class XiaoMi extends ATCar {
val name: String = "xiaomi"
def autoRun():Unit = {
println("小米汽车,自动驾驶.....")
}
}
def main(args: Array[String]): Unit = {
val car1 = new XiaoMi()
car1.autoRun()
}
}
三、抽象类的 “双重能力”:规范与复用的统一
抽象类的核心价值在于同时具备 “约束性” 和 “复用性”:
- 约束性:通过抽象属性和抽象方法,强制子类实现业务特有的逻辑(如汽车的 “价格” 和 “自动驾驶行为”)。
- 复用性:通过具体属性和具体方法,封装通用逻辑(如汽车的 “基础名称” 和 “默认运行行为”),让子类直接继承复用。
package level02
/*
* 抽象类 abstract
* 1.一个抽象类,不能被new
* 一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父亲!
* 2.可以定义抽象方法,在子类中实现
*
* 3.一个抽象类中可以有:
* 1.具体属性 val name: String = "小米"
* 2.具体方法 def autoRun():Unit = {}
* 3.抽象属性 val name: String 没有具体值的属性。只有属性名和类型。它必须写在抽象类中
* 4.抽象方法 def autoRun():Unit
* 在子类中要有具体的实现
*/
package level02
object class13 {
abstract class ATCar {
// 1. 具体属性
var name: String = "car"
val color: String = "default"
// 2. 具体方法
def run(): Unit = {
println("run....")
}
// 3. 抽象属性
var price: Double
// 4. 抽象方法
def autoRun(): Unit
}
class Xiaomi extends ATCar {
// 重写具体属性
name = "小米"
override val color: String = "流光紫"
// 重写具体方法
override def run(): Unit = {
println("小米 run.....")
}
// 实现抽象属性
override var price: Double = 28.8
// 实现抽象方法
override def autoRun(): Unit = {
println("小米自动碾接")
}
}
def main(args: Array[String]): Unit = {
val c1 = new Xiaomi()
c1.autoRun()
c1.run()
println(c1.name)
println(c1.color)
println(c1.price)
}
}