scala Trait及其与抽象类的比较
概念
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及其与抽象类的比较相关推荐
- scala trait ,abstract class,case class,class 的一些琐碎注意事项,仅针对3.0以下
构造函数 主构造函数如果不加val 和var ,只是构造传参而已,不属于类变量 class Demo(name: String)➜ sbt_demo javap -p Demo Compiled fr ...
- Scala Trait 详解(实例)
Trait基础 在Scala中,Trait是一种特殊概念.首先,Trait可以被作为接口来使用,此时Trait与Java的接口非常类似.同时在Trait可以定义抽象方法,其与抽象类中的抽象方法一样,不 ...
- Scala Trait详解
为什么80%的码农都做不了架构师?>>> 除了从父类集成代码外,Scala中的类还允许从一个或者多个traits中导入代码. 对于Java程序员来说理解traits的最好方法就 ...
- scala trait
/*** 特质(interface)就是对应的java中的接口* 在Scala中特质中可以定义有实现的方法,也可以定义没有实现的方法*/ trait ScalaTrait {/*** 可以只定义接口, ...
- scala学习手记34 - trait方法的延迟绑定
trait的方法的延迟绑定就是先混入的trait的方法会后调用.这一点从上一节的实例中也可以看出来. 下面再来看一个类似的例子: abstract class Writer {def write(me ...
- scala java抽象理解_Scala学习笔记(五) 抽象类以及类中的一些语法糖
1. 抽象类 Scala 的抽象类跟Java的一样,不能被实例化. 1.1抽象字段 抽象类中,变量不使用就无需初始化,可以等到子类继承时再进行初始化. scala> abstract class ...
- Scala特证/特质【6.7 特质(Trait)】
Scala特证/特质[6.7 特质(Trait)] 6.7 特质(Trait) Java 的接口 接口的作用 抽象类的作用 6.7.1 特质声明 6.7.2 特质基本语法 6.7.3 特质叠加 6.7 ...
- 成员函数 静态变量做默认参数_Scala系列 (二)Scala的独有特性提高开发效率学会之后玩转函数式与OOP!!...
写在前面: 我是「nicedays」,一枚喜爱做特效,听音乐,分享技术的大数据开发猿.这名字是来自world order乐队的一首HAVE A NICE DAY.如今,走到现在很多坎坷和不顺,如今终于 ...
- Scala语言整理(一)
与Java对比 语法对比 对比项 Java Scala 说明 标识符 / / 反引号括起来的字符也是标识符. 语句结束 分号(;) 分号(;)或者换行 包 package ... package ...
最新文章
- 16.1、python初识面向对象(1)
- html指定表格行列书,js动态生成指定行数的表格
- C++知识点7——函数传参
- 086_访问html元素
- 即时消息服务框架(iMSF)应用实例之分布式事务三阶段提交协议的实现
- ubuntu php 无法执行exec_利用webhook使php项目自动部署
- linux命令小常识
- RemoveError: ‘setuptools‘ is a dependency of conda
- 组件注册-@Scope-设置组件作用域
- ubuntu8.10_深圳源
- 有感而发谈谈苏轼的一生
- 神州数码笔试题C语言,神州数码笔试真题
- 用认知和人性来做最棒的程序员
- 俄黑客入侵100多万部安卓手机 盗取500多万卢布
- 开发视频实时直播需要用到哪些技术?
- vscode中文配置中文插件
- Integer关于equals与==的比较(自动拆装箱技术和常量池技术)
- JZ73 翻转单词序列
- C语言娱乐项目————4、一箭双心
- 360 新推出的搜索会成功吗?
热门文章
- jeecgboot 前端环境搭建_94.精读Serverless 给前端带来了什么
- python json()是什么函数_python 处理 json 四个函数dumps、loads、dump、load的区别
- java对象复制_Java对象的深层复制与浅层复制
- php-fpm linux_Linux下PHP-fpm配置
- cesium 获取当前经纬度和视角还有当前level层级
- python ios自动化_iOS python 自动化构建打包脚本
- python统计图像灰度直方图_python 对一幅灰度图像进行直方图均衡化
- 耳挂式蓝牙耳机原理_耳挂式蓝牙耳机项目总结分析报告
- 学计算机和电脑办公的区别,自学编程和计算机科班出身的差别在哪?
- eventlistener java_EventListener原理