21抽象类

54 阅读2分钟

(一)理解抽象类

类本身就是对对象的抽象,抽象类就是对类的抽象,就是一种更加模糊的类。

定义:抽象类是一个包含一个或多个抽象方法的类。抽象方法是不带任何实现的方法。抽象类也可以包含具体的方法和属性。

目的:抽象类的主要目的是为子类提供公共的接口和部分实现,并确保子类实现抽象方法。

(二)定义抽象类

定义一个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)
    }
}

image.png 定义抽象属性: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()
    }

}

image.png

(四)抽象类重写

如果子类中对抽象类中的方法定义不满意,仍可以使用override去覆盖的。

image.png

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()

  }
}

image.png

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

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

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

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