Scala特质

特质(trait)

Scala中没有接口(interface)的概念

特质用于在类之间共享程序接口和字段,类似Java接口

特质是字段和方法的集合,可以提供字段和方法实现

类和单例对象都可以扩展特质(extends)

特质不能被实例化,因此没有构造参数,类似Java接口

特质使用“trait”关键字定义

实现特质中的方法使用“override”

混入特质(mixin)

当某个特质被用于组合类时,被称为混入
一个类只能有一个父类但是可以有多个混入(分别使用关键字extends和with)

案例:
在这里插入图片描述
注:构造顺序由左往右,如果前面已经构造了某个父类,后面子类的该父类不会重复构造

动态混入特质

在这里插入图片描述

案例

package nj.zb.kb09.oop
//特质
trait Type1{
  def wheele:String={
    "有四个轮子"
  }
  def run():Unit
}

trait Type2{
  def fly():Unit={
    println("可以飞")
  }
  def downSea():Unit={
    println("下海")
  }
}

abstract class Car {
  def brand:String
  def engine:String
  def didi():String={
    "汽车鸣笛滴滴滴"
  }
}

class BMW extends Car with Type1 with Type2 {
  override def brand: String = {
    "德国宝马系"
  }
  override def engine: String = {
    "6.0自然吸气,燃油动力"
  }
  override def run(): Unit = {
    println("在陆地上跑")
  }
}

class LingYun extends Car{
  override def brand: String = {
    "凌云汽车"
  }
  override def engine: String = {
   "纯电动汽车"
  }
}

object DemoCar{
  def main(args: Array[String]): Unit = {
    val bWM =new BMW
    println(bWM.brand)
    println(bWM.engine)
    println(bWM.didi())
    println(bWM.wheele)
    bWM.run()

    //动态混入特质
    val lingYun:LingYun with Type1 with Type2= new LingYun with Type1 with Type2 {
      override def run(): Unit = {
        println("两个轮子的电动汽车")
      }
    }
    lingYun.run()
    lingYun.fly()
    println(lingYun.brand)
    println(lingYun.engine)
  }
}

特质与抽象类的选择

  • 1、优先使用特质
    抽象类只能继承一次
    特质可混入多个
  • 2、需要使用带参构造方法时,使用抽象类
  • 3、与Java互操作性
    抽象类与Java完全可互操作
    特质只有在不包含任何实现代码时才可互操作
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值