抽象类

51 阅读2分钟

一.理解抽象类

  1. 定义:抽象类是一个包含一个或多个抽象方法的类。抽象方法是不带任何实现的方法。抽象类也可以包含具体的方法和属性。
  2. 目的:抽象类的主要目的是为子类提供公共的接口和部分实现,并确保子类实现抽象方法。

二.定义抽象类

  • 定义一个Scala的抽象类:abstract class A{ }。
  • 定义抽象属性:var|val 属性名:类型 一个属性没有初始化,没有值
  • 定义抽象方法:def 方法名():String 只声明没有实现方法。
package level02
/*
abstract: 抽象
抽象属性:只有属性名,没有具体的值
抽象类:
1.有关键字 abstract
2.有抽象成员。只有属性名,没有具体的值 没有 等号
3.不能被new
4.作用:给其他的子类一个标准
 */
object Class017 {
  // 抽象类
  abstract class DreamJob() {
    var money: Double // 只有属性名,没有具体的值。
    var vacation: Int
    var boss: String
  }

  // 子类:具体类
  class PE extends DreamJob {
    var money: Double = 14500
    var vacation: Int = 4
    var boss: String = "无人"
  }

  def main(args: Array[String]): Unit = {
    // new DreamJob() // 报错
    val pe1 = new PE()
    println(pe1.money)
  }
}

三.继承抽象类

子类继承了抽象类,它就必须去实现所有抽象属性和抽象方法

package level02

/*
abstract: 抽象
抽象属性:只有属性名,没有具体的值
抽象类:
1.有关键字 abstract
2.有抽象成员。只有属性名,没有具体的值 没有 等号
3.不能被new
4.作用:给其他的子类一个标准
子类要实现所有抽象成员!
 */
object Class018 {
  // 抽象类
  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去覆盖的。

【修改代码,依次实现相关如下三条内容】重写要点:

(1)抽象类中的方法可以有抽象的和非抽象的,同样属性也可以有抽象的和非抽象的。

(2)抽象方法可以实现,而非抽象方法可以继承或重写。

(2)属性中对于抽象成员是必须要实现的,而非抽象成员可以继承或重写。

package level02

/*
abstract: 抽象
抽象属性:只有属性名,没有具体的值
抽象类:
1.有关键字 abstract
2.有抽象成员。只有属性名,没有具体的值 没有 等号
3.不能被new
4.作用:给其他的子类一个标准
子类要实现所有抽象成员!
如果要重写具体成员,使用override
 */
object Class018 {
  // 抽象类
  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()
  }
}