开发者学堂课程【Scala 核心编程-基础:叠加特质】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8995
叠加特质
内容介绍:
一、基本介绍
二、叠加特质应用案例
三、笔记
内容简介
学完带有特质的对象,动态混入,在 Scala 中创建对象共有几种方式?
1、new 对象,最经典的方式
2、apply 创建对象
3、匿名子类方式创建
4、动态混入
不管是匿名子类还是动态混入,本质都是一样的,最终在底层都是按照 jvmj 创建对象流程,形式上有四种,但是本质上归根结底都是一样的,最终对象 jvmj 进行创建。
一、基本介绍
之前是混入一个特质,构建对象的同时如果混入多个特质,称之为叠加特质,那么特质声明顺序从左到右,方法执行顺序从右到左。
二、叠加特质应用案例
1、目的:分析叠加特质时,对象的构建顺序,和执行方法的顺序。
2、这个叫混入,它本身还是动态混入衍生出来的问题,因此还是写在 mixin 中,新建一个文件,addtraits,代表加了很多的特质。
package com. atguigu. chapter08. mixin
//看看混入多个特质的特点(叠加特质)
object AddTraits {
def main(args: Array[String]): Unit = {
}
}
trait Operate4 {//特点
printIn("Operae4...")特质也可以直接在里面写东西,特质有一部分也是类的东西,它在底层会生成一个构造容器
def insert(id: Int)//抽象方法
}
trait Data4 extends Operate4 {//特质,继承了 Operate4 ,特质之前是继承
println("Data4")
override def insert(id : Int): Unit= { //override 可以删掉,因为是抽象的,也可以保留,实现/重写Operate4的insert,这个特质继承了另外的特质
println("插入数据="+ id)
}
}
trait DB4 extends Data4 {//特质,继承 Data4,Data4继承 Operate4,DB4继承 Data4,形成了三级的关系
println("DB4")
override def insert(id: Int): Unit= {//重写 Data4的 insert,这里 override 不能删掉,删掉会报错
print("向数据库")
super.insert(id)
}
}
trait File4 extends Data4 {//特质,继承 Data4
printIn("File4")
override def insert(id :Int): Unit= {//重写 Data4的 inser
print("向文件")
Super.insert(id)//调用 insert 方法,不能是 Data4,因为混入就不一定是自己的父类,insert 方法指谁跟混入的顺序有关系,这里的 super 在动态混入时,不一定是父类
}
}
class MySQL4 {}//普通类
3、现在有四个特质,关系用图进行描述,
//说明
//1. 创建 MySQL4实例时,动态的混入 DB4 和 File4,处于最底层
//研究第一个问题,当我们创建一个动态混入对象时,其顺序是怎样的
//1.Operate4....
//2.Data4
//3.DB4
//4.File4也有父特质,它也想混入 DB4,它发现 DB4已经被前面走过了,于是它不会走第二次,因为编辑器在底层,它会做一个判断,因为父类不可能往上走,走两次,最终是一个对象,所以这个时候就不会再走,直接 File4。
创建的流程就完成了。
val mysql = new MySQL4 with DB4 with File4 //MySQL4是空的,在混入 DB4时,它会做初始化的动作,DB4虽然是特质,但是它也是类的概念名,一个类继承时先把父类搞定,虽然是个特质,但是 scala 中也有类的概念在里面,所以在创建时也会把它当作一个父类的概念进行使用,同样的道理,它构建DB4,但是发现 DB4有 Data4,Data4有父类 Operate4,因此它首先执行 Operate4,整个流程是按照对象的构建进行,所以第一个应该输入 Operate4。
Println(mysql)进行输出
运行,可以看到代码跟分析的是一样的。
Operate4
Data4
DB4
Fi1e4
//总结一句话
// Scala 在叠加特质的时候,会首先从后面的特质开始执行(即从左到右)
//研究第二个问题,当我们执行一个动态混入对象的方法,其执行顺序是怎样的
//顺序是,(1)从石到左开始执行,像栈,在函数加载时使用栈,最后进去的先执行,底层函数方法是栈,最后的方法先执行(2)当执行到 super 时,是指的左边的特质(3)如果左边没有特质了,则super就是父特质
//1.先执行的是 Fi1e4里面的方法,‘’向文件‘’,先执行这句话
//调用 super 方法,如果不调用就不执行,super 不再指的是 Data4,因为顺序是从左到右,其实在栈中的父类是DB4,因为它是动态构建的,不是静态的,不能认为它的 super 就是 Data4,它是动态形成的类,类的层级关系已经发生变化了。
//当执行到 super 时,是指的左边的特质,因为对象的层级关系,可以理解 DB4是 Fi1e4的父类,执行之后,左边的特质是 DB4,不是 Data4。
建议学习栈,二叉树,环形链表,单向链表,双向链表,哈希散列。
//2.向数据库
//3.插入数据100 把 id一层一层传进来
mysql.insert(100)
}
}
更改println("向数据库")
更改println("向文件")
进行执行,可以看到向文件,向数据库,插入数据=100,到此相对一个动态的综合混入案例包括它的构建,执行分析完毕,如果看底层,可以理解为构建时 MySQL4 已经不是真正的 MySQL4,而是混入了一个新的对象,DB4是它的父特质,File4是它的超级父特质,执行时是反过来进行执行的。
三、笔记
1、课堂练习
在 Scala 中创建对象共有几种方式?
(1)new 对象
(2)apply 创建
(3)匿名子类方式
(4)动态混入
2、叠加特质基本介绍
构建对象的同时如果混入多个特质,称之为叠加特质。那么特质声明顺序从左到右,方法执行顺序从右到左。
3、叠加特质应用案例
目的:分析叠加特质时,对象的构建顺序,和执行方法的顺序。
