Scala的抽象类

38 阅读4分钟

内容:

1.理解抽象类

2.定义抽象类

3.继承抽象类

4.抽象类重写

理解抽象类

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

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

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

定义抽象类

定义一个Scala的抽象类:

package level02

/*
*  抽象类  abstract
*  1,一个抽象类(加了abstract修饰的),不能被new
*  2,一个类不能直接来创建对象,那么这个类具体有什么用呢?做别人的父类
 */
object class011 {
  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()
  }
}

继承抽象类

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

代码如下:

package level02

/*
*  抽象类  abstract
*  1,一个抽象类(加了abstract修饰的),不能被new
*  2,一个类不能直接来创建对象,那么这个类具体有什么用呢?做别人的父类
*  3,可以定义抽象方法,在子类中去实现
 */
object class011 {
  abstract class AICar {
    // 抽象方法:没有具体的函数代码
    def autoEn():Unit
    //具体方法
    def autoDrive():Unit = {
      println("具体方法,自动驾驶...")
    }
  }
  // 在子类中,一定要实现父类所有的抽象方法
  class SU7 extends AICar{
  // 使用override去实践这个方法
    override def autoEn():Unit = {
      println(s"采用小米独家的无线充电技术,停车就可以充电")
    }
  }

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

抽象类重写

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

代码如下:

package level02
/*
*  抽象类  abstract
*  1,一个抽象类(加了abstract修饰的),不能被new
*  2,一个类不能直接来创建对象,那么这个类具体有什么用呢?做别人的父类
*  3,可以定义抽象方法,在子类中去实现
*
*  4,一个抽象类中可以有:
*     1,具体属性  val name:Sting = "小米"
*     2,具体方法
*     3,抽象属性  val name:Sting 没有具体的属性,只有属性名和类型,必须写在抽象类中
*     4,抽象方法  def autoRun():Unit
 */
object class012 {
  
  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()
  }
}

修改代码重写要点:

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

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

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

代码如下:

package level02

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

  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 {
    //重写
    // 1,具体属性
    name = "小米"
    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)

  }
}