Scala抽象类

64 阅读4分钟

004DCD9A.jpg

(一)理解抽象类

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

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

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

(二)定义抽象类

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

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

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

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

  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()
  }
  
  //运行结果如下:
  具体方法,制动驾驶...

(三)继承抽象类

💕💕子类继承了抽象类,它就必须去实现所有抽象属性和抽象方法 (可以定义抽象方法 在子类中去实现)。

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

object a1111 {


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

    //具体方法
    def autoDrive():Unit = {
      println("具体方法,制动驾驶...")
    }
  }


  class SU7 extends  AICar{

    override def autEn(): Unit = {
      println(s"采用小米独家的无线充电技术,停车就可以充电")
    }
  }

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

    //val car1 = new AICar()
    val su = new SU7()
    su.autEn()
  }
  
  运行结果:
  采用小米独家的无线充电技术,停车就可以充电

(四)抽象类重写

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

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

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

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

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

  2.可以定义抽象方法 在子类中去实现

  3.一个抽象类中可以有:
     具体属性: val name:String = "小米"
     具体方法: def autoRun():Unit
     抽象属性:val name:String 没有具体值的属性 只有属性名和类型 他必须写在抽象类中
     抽象方法:def autoRun():Unit 在子类中 要有具体的实现


*/
  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()
  }
  
  运行结果:
  小米汽车,自动驾驶...

一个抽象类中可以有:

具体属性: val name:String = "小米"

具体方法: def autoRun():Unit

抽象属性:val name:String 没有具体值的属性 只有属性名和类型 他必须写在抽象类中

抽象方法:def autoRun():Unit 在子类中 要有具体的实现

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

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

    //重写 具体属性和具体方法
    //1. 具体属性
    name = "小米" //对于val的属性 直接覆盖
    // 2.具体方法
    override val color = "流光紫"  //对于val的属性 要添加override
  }

  def main(args: Array[String]): Unit = {
    var c1 = new XiaoMI
    c1.autoRun()
    c1.run()
    println(c1.name)
    println(c1.color)
  }
  
  //运行结果:
  小米自动驾驶 
  run.....
  小米
  流光紫