在Scala中,抽象类是被abstract关键字修饰的类,它是一种不能直接实例化的类,主要用于定义子类的共同接口和部分实现,体现面向对象的抽象性和继承性。 抽象类可以包含抽象成员和具体成员。抽象成员包括抽象方法(未实现的方法,仅声明方法签名,无方法体)和抽象字段(未初始化的字段);具体成员则是有完整实现的方法或已初始化的字段。例如,抽象类Shape可声明抽象方法area(),同时包含具体方法printInfo()。 子类继承抽象类时,必须使用extends关键字,且必须实现抽象类中所有未实现的抽象成员(除非子类自身也是抽象类)。实现抽象方法时,需用override关键字显式标记,以明确表示对父类方法的重写。 抽象类可以有构造器(包括主构造器和辅助构造器),但子类继承时需遵循构造器调用规则。此外,抽象类可继承其他类或特质(trait),也可被多个子类继承,形成类层次结构。 与特质相比,抽象类更适合作为类层次的根节点,承载共性实现;而特质更侧重功能组合。在实际开发中,抽象类常用于定义具有明确继承关系的抽象概念,如动物、交通工具等,通过子类具体化不同实现,实现代码复用和多态特性。
一.理解抽象类
类本身就是对对象的抽象,抽象类就是对类的抽象,就是一种更加模糊的类。
定义:抽象类是一个包含一个或多个抽象方法的类。抽象方法是不带任何实现的方法。抽象类也可以包含具体的方法和属性。
目的:抽象类的主要目的是为子类提供公共的接口和部分实现,并确保子类实现抽象方法。
二.定义抽象类
定义一个Scala的抽象类:abstract class A{ }。
定义一个智能汽车类
abstract class AICar(){
def autoRun():Unit
var name:String
}
定义抽象属性:var|val 属性名:类型 一个属性没有初始化,没有值
定义抽象方法:def 方法名():String 只声明没有实现方法。
三.抽象类的继承
子类继承了抽象类,它就必须去实现所有抽象属性和抽象方法
package A2
/*
* 抽象类 abstract
* 1.一个抽象类(加了abstract修饰的),不能被new
* 一个类不能用来创建对象,只能用来做父类
* */
abstract class AICar {
//抽象方法
def autoEn(): Unit
//具体方法
def autoDrive(): Unit = {
println("具体方法,智能驾驶.....")
}
}
class SU7 extends AICar {
override def autoEn(): Unit = {
println(s"采用小米独家的无线充电技术,停车就可以充电")
}
}
object Class13 {
def main(args: Array[String]): Unit = {
// 抽象类不能实例化,以下代码注释掉
// val car1 = new AICar()
val su = new SU7()
su.autoEn()
su.autoDrive() // 可以调用父类的具体方法
}
}
图示如下:
四.抽象类重写
如果子类中对抽象类中的方法定义不满意,仍可以使用override去覆盖的。
代码如下:
package A2
/*
* 抽象类 abstract
* 1.一个抽象类(加了abstract修饰的),不能被new
* 一个类不能用来创建对象,只能用来做父类
*
* 2.可以定义抽象方法,在子类中去实现
*
* 3.一个抽象类中可以有:
* 1.具体属性 val name:String = "小米"
* 2.具体方法:def autoRun():Unit = {}
* 3.抽象属性:val name:String 没有具体值的属性。只有属性名和类型。他必须写在抽象类中
* 4.抽象方法:def autoRun():Unit
* 在子类中,要有具体的实现
*
* */
abstract class AICar {
//1.具体属性
var name: String = "car"
var color: String = "black"
//2.具体方法
def run(): Unit = {
println("run......")
}
//3.抽象属性(没有属性值)
var price: Double // 修正拼写错误:prcie -> price
//4.抽象方法(没有方法体)
def autoRun(): Unit
}
class XiaoMi extends AICar {
//重写具体属性
name = "小米"
//override val color = "流光紫" // 父类是var,子类重写也需保持var
//重写具体方法
override def run(): Unit = {
println("小米 run.....")
}
//实现抽象属性
var price: Double = 28.8 // 明确类型,实现抽象属性
//实现抽象方法
override def autoRun(): Unit = {
println("小米驾驶")
}
}
object Class14 {
def main(args: Array[String]): Unit = {
// 测试子类实例
val miCar = new XiaoMi()
println(s"名称:${miCar.name},颜色:${miCar.color},价格:${miCar.price}万")
miCar.run()
miCar.autoRun()
}
}