(一)理解抽象类
类本身就是对对象的抽象,抽象类就是对类的抽象,就是一种更加模糊的类。
定义:抽象类是一个包含一个或多个抽象方法的类。抽象方法是不带任何实现的方法。抽象类也可以包含具体的方法和属性。
目的:抽象类的主要目的是为子类提供公共的接口和部分实现,并确保子类实现抽象方法。
(二)定义抽象类
定义一个Scala的抽象类:abstract class A{ }。
package level02
/*abstract: 抽象*
*抽象属性:只有属性名,没有具体的值。
* 抽象类
* 有关键字 abstract
* 有抽象成员。只有属性名,没有具体的值 没有 等号。
* 不能被 new
* 作用:给其他的子类立一个标准!
*/
object Class15 {
// 抽象类
abstract class DreamJob{
var money:Double// 只有属性名,没有具体的值。
var vacation:Int
var boss:String
}
// 子类:具体类
class PE extends DreamJob{
var money: Double = 16500
var vacation: Int = 4
var boss: String = "无人"
}
def main(args: Array[String]): Unit = {
// new DreamJob() // 报错
val pe1 = new PE()
println(pe1.money)
}
}
定义抽象属性:var|val 属性名:类型 一个属性没有初始化,没有值
定义抽象方法:def 方法名():String 只声明没有实现方法。
(三)继承抽象类
子类继承了抽象类,它就必须去实现所有抽象属性和抽象方法
package level02
/*抽象类
有关键字 abstract
有
抽象成员:只有属性名,没有具体的值 没有 等号。
具体成员
子类要实现所有的抽象成员!
*/
object Class16 {
// 抽象类
abstract class DreamJob {
// 抽象属性
var money:Double// 只有属性名,没有具体的值。
var vacation:Int
var boss:String
// 具体属性
var name:String = "理想工作"
// 抽象方法:没有等号,就是一个抽象的方法,它需要在子类中去实现
def addMoney():Unit
// 具体方法
def getMoney():Unit = {
println(s"发工资:${money}元")
}
}
// 子类:具体类
class PE extends DreamJob{
var money: Double = 14500
var vacation: Int = 4
var boss: String = "无人"
def addMoney(): Unit = {
money *= 1.1
}
}
def main(args: Array[String]): Unit = {
// new DreamJob() // 报错
val pe1 = new PE()
pe1.addMoney()
pe1.getMoney()
}
}
(四)抽象类重写
如果子类中对抽象类中的方法定义不满意,仍可以使用override去覆盖的。
package level02
/*抽象类
有关键字 abstract
有
抽象成员:只有属性名,没有具体的值 没有 等号。
具体成员
子类要实现所有的抽象成员!
*/
object Class16 {
// 抽象类
abstract class DreamJob {
// 抽象属性
var money: Double // 只有属性名,没有具体的值。
var vacation: Int
var boss: String
// 具体属性
var name: String = "理想工作"
// 抽象方法:没有等号,就是一个抽象的方法,它需要在子类中去实现
def addMoney(): Unit
// 具体方法
def getMoney(): Unit = {
println(s"发工资:${money}元")
}
}
// 子类:具体类
class PE extends DreamJob {
var money: Double = 14500
var vacation: Int = 4
var boss: String = "无人"
def addMoney(): Unit = {
money *= 1.1
}
override def getMoney(): Unit = {
println(s"上银行卡:${money}元")
}
}
def main(args: Array[String]): Unit = {
// new DreamJob() // 报错
val pe1 = new PE()
pe1.addMoney()
pe1.getMoney()
}
}
【修改代码,依次实现相关如下三条内容】重写要点:
(1)抽象类中的方法可以有抽象的和非抽象的,同样属性也可以有抽象的和非抽象的。
(2)抽象方法可以实现,而非抽象方法可以继承或重写。
(2)属性中对于抽象成员是必须要实现的,而非抽象成员可以继承或重写。