- 如果在父类中,有某些方法无法立即实现,而需要依赖不同的子类来覆盖,重写实现不同的方法。此时,可以将父类中的这些方法编写成只含有方法签名,不含方法体的形式,这种形式就叫做抽象方法;
- 一个类中,如果含有一个抽象方法或抽象field,就必须使用abstract将类声明为抽象类,该类是不可以被实例化的;
- 在子类中覆盖抽象类的抽象方法时,可以不加override关键字;
举例说明:
// 抽象类
abstract class Person() {
// 抽象方法,默认是抽象的,如果你定义了值,那就不是抽象的了
val age:Int
def sayHello:String
def sayBay:String
}
class Student(name:String)extends Person(){
// 子类继承父类,重写超类(父类)方法
override def sayHello: String = "Hello,"+name
override def sayBay: String = "bay,"+name
override val age: Int = 20
}
object Student{
def main(args: Array[String]): Unit = {
val jim = new Student("jim")
println(jim.age) //20
}
}
注意:
- 在scala中覆盖一个抽象类中字段时,可以不写override
- 使用var定义的抽象字段只能使用var覆盖
- 使用val定义的抽象字段只能使用val覆盖
- 抽象类不一定有抽象字段或抽象方法,只需要添加abstract关键字
- 有抽象字段一定是抽象类
- 重写字段的实质是在重写字段的setter、getter方法
抽象类中可以有非抽象的方法