概念

1 类似java的接口
2与抽象class没啥区别,除了关键字
3子类可以继承1个trait,关键字extends
4子类也可以继承多个trait,不过需要使用with关键字

class继承单个trait

如下例子,Logger是trait类型,然后MrLogger实现了trait. 在scala中实现的关键字不是implement,还是extends.class MrLogger extends Logger表明MrLogger继承了trait特质Logger. 然后MrLogger就需要实现Logger中的抽象方法log方法

trait Logger{def log(msg:String) //抽象方法
}class MrLogger extends Logger{//重写trait中的抽象方法override def log(msg: String): Unit = println(msg)
}object MrLoggerTest{def main(args: Array[String]): Unit = {val m=new MrLogger()m.log("error begin")}
}

class继承多个trait

scala不支持对类进行多继承,但是支持多重继承trait,使用with关键字即可。比如在下面例子中,类Person10继承了多个trait,SayHello,MakeFriends,
SayBye等等.其中一个用extends关键字,另外两个用with关键字,然后要实现这3个trait中所有的抽象方法 . (思考,这种多继承有何缺陷?)

trait SayHello{def sayHello(name:String)
}trait MakeFriends{def mkFriends(p:Person10)
}trait SayBye{def sayBye()
}//定义子类实现3个trait
class Person10(val name:String) extends SayHello with MakeFriends with SayBye {override def sayHello(name: String): Unit = println("hello "+name)override def mkFriends(p: Person10): Unit = {println("hello, i am "+name+"you are"+p.name+"我们做朋友吧")}override def sayBye(): Unit = println("see you again")
}object Test{def main(args: Array[String]): Unit = {val p1=new Person10("yangzi")val p2=new Person10("huzi")p1.mkFriends(p2)p1.sayHello("libai")}
}

Trait中可以有实现的方法

一般java接口中是不允许有实现的方法.当然新版本放松了这个限制.
Trait实现了的方法,子类就可以直接调用了. 不需要重写.

trait Logger1 {//可以在trait中定义实现了的方法,这个java中不可以def log(msg: String) = println(msg)
}class Account {protected var balance = 0.0
}//继承trait Logger1后,子类可以直接使用其已经实现的方法,比如本例中可以直接调用log方法
class SavingAccount extends Account with Logger1 {def withDrawMoney(amount: Double): Unit = {if (amount > balance) log("余额不足")else balance -= amount}
}object Test1 {def main(args: Array[String]): Unit = {val obj = new SavingAccount()obj.withDrawMoney(100) //余额不足}
}

trait可以继承class

java中,接口是不能继承类的,

class MyUtil{def printMsg(msg:String):Unit=println(msg)
}
//trait继承了MyUtil这个普通类,就可以直接调用这个类中的方法
trait myTrait extends MyUtil{def log(msg:String):Unit =printMsg("log:"+msg)
}//继承了myTrait,同时就继承了MyUtil这个普通类.可以用myTrait和MyUtil这个普通类的方法
class Demo(val name:String) extends myTrait{def sayHello():Unit={log(name+" 000")printMsg(name+" test")}
}object  Test2{def main(args: Array[String]): Unit = {val a=new Demo("liming");a.sayHello()}
}

trait与抽象类的区别

区别不大,除了关键字

trait应用

待补充

总结

trait就当做接口来理解就可以了.

scala Trait及其与抽象类的比较相关推荐

  1. scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下

    构造函数 主构造函数如果不加val 和var ,只是构造传参而已,不属于类变量 class Demo(name: String)➜ sbt_demo javap -p Demo Compiled fr ...

  2. Scala Trait 详解(实例)

    Trait基础 在Scala中,Trait是一种特殊概念.首先,Trait可以被作为接口来使用,此时Trait与Java的接口非常类似.同时在Trait可以定义抽象方法,其与抽象类中的抽象方法一样,不 ...

  3. Scala Trait详解

    为什么80%的码农都做不了架构师?>>>    除了从父类集成代码外,Scala中的类还允许从一个或者多个traits中导入代码. 对于Java程序员来说理解traits的最好方法就 ...

  4. scala trait

    /*** 特质(interface)就是对应的java中的接口* 在Scala中特质中可以定义有实现的方法,也可以定义没有实现的方法*/ trait ScalaTrait {/*** 可以只定义接口, ...

  5. scala学习手记34 - trait方法的延迟绑定

    trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer {def write(me ...

  6. scala java抽象理解_Scala学习笔记(五) 抽象类以及类中的一些语法糖

    1. 抽象类 Scala 的抽象类跟Java的一样,不能被实例化. 1.1抽象字段 抽象类中,变量不使用就无需初始化,可以等到子类继承时再进行初始化. scala> abstract class ...

  7. Scala特证/特质【6.7 特质(Trait)】

    Scala特证/特质[6.7 特质(Trait)] 6.7 特质(Trait) Java 的接口 接口的作用 抽象类的作用 6.7.1 特质声明 6.7.2 特质基本语法 6.7.3 特质叠加 6.7 ...

  8. 成员函数 静态变量做默认参数_Scala系列 (二)Scala的独有特性提高开发效率学会之后玩转函数式与OOP!!...

    写在前面: 我是「nicedays」,一枚喜爱做特效,听音乐,分享技术的大数据开发猿.这名字是来自world order乐队的一首HAVE A NICE DAY.如今,走到现在很多坎坷和不顺,如今终于 ...

  9. Scala语言整理(一)

    与Java对比 语法对比 对比项 Java Scala 说明 标识符 / / 反引号括起来的字符也是标识符. 语句结束 分号(;) 分号(;)或者换行   包 package ... package ...

最新文章

  1. 16.1、python初识面向对象(1)
  2. html指定表格行列书,js动态生成指定行数的表格
  3. C++知识点7——函数传参
  4. 086_访问html元素
  5. 即时消息服务框架(iMSF)应用实例之分布式事务三阶段提交协议的实现
  6. ubuntu php 无法执行exec_利用webhook使php项目自动部署
  7. linux命令小常识
  8. RemoveError: ‘setuptools‘ is a dependency of conda
  9. 组件注册-@Scope-设置组件作用域
  10. ubuntu8.10_深圳源
  11. 有感而发谈谈苏轼的一生
  12. 神州数码笔试题C语言,神州数码笔试真题
  13. 用认知和人性来做最棒的程序员
  14. 俄黑客入侵100多万部安卓手机 盗取500多万卢布
  15. 开发视频实时直播需要用到哪些技术?
  16. vscode中文配置中文插件
  17. Integer关于equals与==的比较(自动拆装箱技术和常量池技术)
  18. JZ73 翻转单词序列
  19. C语言娱乐项目————4、一箭双心
  20. 360 新推出的搜索会成功吗?

热门文章

  1. jeecgboot 前端环境搭建_94.精读Serverless 给前端带来了什么
  2. python json()是什么函数_python 处理 json 四个函数dumps、loads、dump、load的区别
  3. java对象复制_Java对象的深层复制与浅层复制
  4. php-fpm linux_Linux下PHP-fpm配置
  5. cesium 获取当前经纬度和视角还有当前level层级
  6. python ios自动化_iOS python 自动化构建打包脚本
  7. python统计图像灰度直方图_python 对一幅灰度图像进行直方图均衡化
  8. 耳挂式蓝牙耳机原理_耳挂式蓝牙耳机项目总结分析报告
  9. 学计算机和电脑办公的区别,自学编程和计算机科班出身的差别在哪?
  10. eventlistener java_EventListener原理