快学Scala 第二十课 (trait的构造顺序)
trait的构造顺序:
- 首先调用超类构造器
- 特质构造器在超类构造器之后,类构造器之前执行
- 特质从左向右被构造
- 每个特质当中,父特质先被构造
- 如果多个特质共有一个父特质,而那个父特质已经被构造,则不会被再次构造
- 所有特质构造完毕,子类被构造
class Account {
println("Account constructor")
}
trait Logged {
println("Logged constructor")
def log(msg: String){ println("Logged")}
}
trait LongLogger extends Logged{
println("LongLogger constructor")
override def log(msg: String){
println("LongLogger")
super.log(msg)
}
}
trait ShortLogger extends Logged{
println("ShortLogger constructor")
override def log(msg: String){
println("ShortLogger")
super.log(msg)
}
}
trait ConsoleLogger extends Logged {
println("ConsoleLogger constructor")
override def log(msg: String){
println("ConsoleLogger")
super.log(msg)
}
}
trait DetailedLogger{
println("DetailedLogger constructor")
def log2(msg: String){
println("DetailedLogger")
}
}
class SavingsAccount extends Account with LongLogger with ShortLogger with ConsoleLogger {
println("SavingsAccount constructor")
log("funds")
}
new SavingsAccount() with DetailedLogger
运行结果:
Account constructor
Logged constructor
LongLogger constructor
ShortLogger constructor
ConsoleLogger constructor
SavingsAccount constructor
ConsoleLogger
ShortLogger
LongLogger
Logged
DetailedLogger constructor
快学Scala 第二十课 (trait的构造顺序)的更多相关文章
- 快学Scala 第二十一课 (初始化trait的抽象字段)
初始化trait的抽象字段: trait Logged { println("Logged constructor") def log(msg: String){ println( ...
- 快学Scala 第二十二课 (apply和unapply)
apply和unapply: apply方法经常用在伴生对象中,用来构造对象而不用显式地使用new. unapply是当做是伴生对象的apply方法的反向操作.apply方法接受构造参数,然后将他们变 ...
- 快学Scala 第十课 (包和包对象)
Scala包定义: 嵌套式: package a1 { class a1Class{ val age = 10 } package a2 { class PackageTest { def main( ...
- 快学Scala 第十九课 (trait的abstract override使用)
trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...
- 快学Scala 第十二课 (抽象类, 抽象字段, 提前定义)
抽象类: Scala 抽象类中,抽象方法不需要使用abstract. 在子类中重写超类抽象方法时,不需要使用override. abstract class Person { def say(s: S ...
- 快学Scala 第十八课 (trait多继承)
trait多继承: trait的继承并不像类拥有相同的含义!在下面这个例子中,如果还是运用类的继承的思想,那么运行结果将是什么也没有. trait Logged { def log(msg: Stri ...
- 快学Scala 第二课 (apply, if表达式,循环,函数的带名参数,可变长参数,异常)
apply方法是Scala中十分常见的方法,你可以把这种用法当做是()操作符的重载形式. 像以上这样伴生对象的apply方法是Scala中构建对象的常用手法,不再需要使用new. if 条件表达式的值 ...
- 快学Scala 第十七课 (trait 入门)
trait 入门: trait类似于java的接口,不过比java接口功能更强大,可以有实体成员,抽象成员,实体方法,抽象方法. 如果需要混入的特质不止一个用with关键字. 带有特质的对象:(特质可 ...
- 快学Scala 第十四课 (读取行,读取字符, 控制台读取)
读取行: import scala.io.Source object FileReader { def main(args: Array[String]): Unit = { val source = ...
随机推荐
- HDU 6364 Ringland
Ringland 题意: 在一个环上有n个男生, n个女生, 现在要求每一个男生与女生配对, 求总代价最小. 题解: 如果2个男生到女生的路交叉了, 那么我们交换这2个男生的路, 总代价是一定会变得小 ...
- CF1005D Polycarp and Div 3 思维
Polycarp and Div 3 time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- VScode神器如何同步配置和所装插件
由于近期编辑器换用vscode,回到家里也需要写代码,但是家里电脑也需要安装vscode,并设置相同配置和插件.想到以前webstrom可以直接导出配置然后安装. 但是vscode无此配置,突发奇想g ...
- IDC是什么?
IDC:互联网数据中心,是电信部门利用已有的互联网通信线路.贷款资源,建立标准化的电信专业级机房环境,为企业.政府提供服务器托管.服务器租用以及相关增值等方面服务.IDC是全球协作的特定设备网络,用来 ...
- Docker下使用disconf:极速体验
Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...
- JAVA测试(选择题)
1.分析如下所示的Java代码,其中this关键字的意思是( ) Public class Test { Private String name; Public String getName(){ ...
- java静态代码块/静态属性、构造块、构造方法执行、main方法、普通代码块的顺序
java静态代码块/静态属性.构造块.构造方法执行.main方法.普通代码块的顺序 这也是在笔试中的一个重要的考点,就有一个输出语句让你写出输出的结果. 理论知识: 静态代码块是:属于类的,在类加载时 ...
- hive内部表与外部表区别详细介绍
问题导读:1.创建内部表与外部表的区别是什么?2.external关键字的作用是什么?3.外部表与内部表的区别是什么?4.删除表的时候,内部表与外部表有什么区别?5.load data local i ...
- eclipse查看.class文件
要使用jd-gui.exe反编译程序 步骤:window-preferences-general-editors-file associations, 如下图 上面的框选中,*.class witho ...
- Mysql中有符号数和无符号数的区别
1原文地址:https://blog.csdn.net/s78365126/article/details/85048882 2可以手写sql验证一下 3mysql无符号和有符号的区别无符号unsig ...