scala抽象类

328 阅读4分钟

专为继承而生的类:抽象类

1.理解抽象类

2.定义和实现抽象类

3.继承抽象类

4.抽象类重写

(一)理解抽象类

抽象类 = 不能直接用的 “父类模板”

  1. 自己没法单独用(不能 new 它);

  2. 要想用,得让别的类 “继承” 它;

  3. 它里面可以有现成的功能(子类直接用),也可以要求子类必须自己写某些功能。

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

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

package level02
/*
* 抽象类 abstract
*   1.一个抽象类(加了abstract修饰的),不能被new。
*     一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父类!
 */
object O02 {

  abstract class AICar {
    def autoDrive(): Unit = {
      println("具体方法,自动驾驶......")
    }
  }

  class SU7 extends AICar {

  }

  def main(args: Array[String]): Unit = {

    // val car1 = new AICar ()
    val su = new SU7()
    su.autoDrive()
  }
}

(二)定义和实现抽象类

定义一个Scala的抽象类:abstract class A{ }

如:定义一个智能汽车类

package level02
/*
* 抽象类 abstract
*   1.一个抽象类(加了abstract修饰的),不能被new。
*     一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父类!
*   2.可以定义抽象方法,在子类中去实现
 */
object O03 {

  abstract class AICar{
    // 抽象方法,没有具体的函数代码
    def autoEN():Unit

    // 具体方法
    def autoDrive(): Unit = {
      println("具体方法,自动驾驶......")
    }
  }
  // 在子类中,一点要去实现父类的所有抽象方法
  class SU7 extends AICar {

    // 使用override 来实现这个方法
    override def autoEN(): Unit = {
      println("采用小李研发的无线充电技术,停车就可以充电")
    }
  }

  def main(args: Array[String]): Unit = {
    // val car1 = new AICar ()
    val su = new SU7()
    su.autoEN()
  }
}

定义抽象属性:var|val 属性名:类型 一个属性没有初始化,没有值

定义抽象方法:def 方法名():String 只声明没有实现方法。

(三)继承抽象类

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

抽象类给规则,子类照做就能用:

  1. 抽象类说“必须有XX功能”(抽象方法);

  2. 子类继承它,把“XX功能”实现了;

  3. 子类就能正常用,还能拿抽象类里现成的功能。

package level02

/*
* 抽象类 abstract
* 1. 一个抽象类(加了abstract修饰的),不能被new。
*   一个类不能直接用来创建对象,那么这个类具体有什么用呢?做别人的父类!
* 2. 可以定义抽象方法,在子类中去实现
*
* 3. 一个抽象类中可以有:
*   1. 具体属性 val name:String = "小米"
*   2. 具体方法 def autoRun():Unit = {}
*
*   3. 抽象属性 val name:String 没有具体值的属性,只有属性名和类型。它必须写在抽象类中
*   4. 抽象方法: def autoRun():Unit
*               在子类中,要有具体的实现。
* */
object O04 {

  abstract class AICar {
    val name: String

    def autoRun(): Unit
  }

  class XiaoMi extends AICar {
    val name: String = "xiaomi"

    def autoRun(): Unit = {
      println("小米汽车,自动驾驶......")
    }
  }

  def main(args: Array[String]): Unit = {
    var car1 = new XiaoMi()
    car1.autoRun()
  }
}

(四)抽象类的重写

抽象类的重写可以理解为:抽象类先 “画个饼”(定义抽象的属性或方法,只有名字没内容),子类必须 “把饼做出来”(给这些属性赋值、给方法写具体逻辑)

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

package level02

/*
* 抽象类 abstract

* 3. 一个抽象类中可以有:
*   1. 具体属性 val name:String = "小米"
*   2. 具体方法 def autoRun():Unit = {}
*
*   3. 抽象属性 val name:String 没有具体值的属性,只有属性名和类型。它必须写在抽象类中
*   4. 抽象方法: def autoRun():Unit
*               在子类中,要有具体的实现。
* */
object O05 {

  abstract class AICar {
    // 1.具体属性
    var name: String = "car"
    val color: String = "black"
    // 2.具体方法
    def run(): Unit = {
      println("AIcar run...")
    }
    // 3.抽象属性,没有属性值
    var price: Double
    // 4.抽象方法,没有方法体
    def autoRun(): Unit
  }

  class XiaoMi extends AICar {
    // 重写
    // 1. 具体属性
    name = "小米"// 对于var的属性,直接覆盖
    override val color = "流光紫" // 对于val的属性,要添加override
    // 2. 具体方法
    override def run(): Unit = {
      println("小米 run......")
    }

    // 实现
    // 3. 实现 抽象属性
    var price = 28.8
    // 4. 实现 抽象方法
    def autoRun(): Unit = { println("小米自动驾驶")}
  }

  def main(args: Array[String]): Unit = {
    var c1 = new XiaoMi()
    c1.autoRun()
    c1.run()
    println(c1.name)
    println(c1.color)
  }
}