特质构造的顺序|学习笔记

简介: 快速学习特质构造的顺序。

开发者学堂课程【Scala 核心编程-基础:特质构造的顺序】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/609/detail/9000


特质构造的顺序

 

内容介绍

一、特质构造顺序

二、整理

 

一、特质构造顺序

1、介绍

特质也是有构造器的,构造器中的内容由“字段的初始化”

和一些其他语句构成。具体实现请参考“特质叠加”

2、第一种特质构造顺序(声明类的同时混入特质)

混入有两种方式一个是动态混入一个是声明时混入

(1)调用当前类的超类构造器

(2)第一个特质的父特质构造器

(3)第一个特质构造器

(4)第二个特 质构造器的父特质构造器,如果已经执行过,就不再执行。

(5)第二个特质构造器。

(6)重复4,5的步骤(如果有第3个,第4个特质)

(7)当前类构造器[案例演示]

trait AA{

println("A...")

}

trait BB extends AA {

println(B....")

}

trait CC extends BB {

println("C....")

}

trait DD extends BB {

println("D....")

}

class EE {

println("E...")

}

class FF extends EE with CC with DD { 这个地方也叫混入但是它是在声明类同时混入特质也是类似于静态的一种方式如果FF继承相当于 CC DD 也被继承下来

printlnf"F...")

}

class KK extends EE {

println("K....")

}

创建命名为 MixInSeq选择 object

package com. atguigu. chapter08. mixin

object MixInSeq {

Def main(args: Array[String]): Unit = {

它的构建顺序跟 java 非常相似

//这时 FF 是这样形式 class FF extends EE with CC with DD

/*

调用当就类的超类构造器

第一个特质的父特质构造器把静态声明当作一个整体对待第一个父构造器是 CC

第一个特质构造器

第二个特质构造器的父特质构造器,如果 已经执行过,日就不再执行

第二个特质构造器

.......重复4, 5的步骤(如果有第3个,第4个特质)

当前类构造器[ 案例演示]

*/

//1. E...

//2. A...

//3. B....

//4. C....

//5. D....

//6. F....

整个走完才执行当前类构造器最后执行自己的构造器FF

val ff1 = new FF()    FF是在下面声明的

println(ff1)

//val ff2 = new KK() with CC with DD 先注释

//println(ff2)

trait AA{  AA是一个特质

println("A...")

}

trait BB extends AA {  BB继承AA第二层BB有一个父类构造器

println(B....")

}

trait CC extends BB {   CC继承BB,第三层CC有一个父类构造器

println("C....")

}

trait DD extends BB {  DD继承BB,第三层,BB已经构建过

println("D....")

}

class EE {//普通类

println("E...")

}

class FF extends EE with CC with DD { //先继承了EE类, 然后再继承cc和DD

printlnf"F...")

}

class KK extends EE { //KK直接继承了普通类

println("K....")

}

进行执行执行结果如下

D: \program\jdk8\bin\java

E...

A...

B....

C....

D....

F....

com. atguigu. chapter08. mixin. FF@4ec6a292

第一种静态的方式操作结束第二种动态混入

val ff1 = new FF()    

println(ff1)

//这时我们是动态混入

/*

先创建 new KK 对象然后再混入其他特质

从构建的顺序可以看出它在进行静态工作时这个对象本身还没有创建因此它整个流程是严格按照继承的关系进行的

调用当前类的超类构造器

当前类构造器

第一个特质构造器的父特质构造器

第一个特质构造器

第二个特质构造器的父特质构造器,如果已经执行过,就不再执行

第二个特质构造器

......重复5, 6的步骤(如果有第3个,第4个特质)

当前类构造器[ 案例演示]

*/

//1.E...

//2.K...

//3.A...

//4.B

//5.C

//6.D

println(''==========================" )

val ff2 = new KK() with CC with DD  静态混入是先KK再动态混入CC with DD

println(ff2)

trait AA{  

println("A...")

}

trait BB extends AA {  

println(B....")

}

trait CC extends BB {   

println("C....")

}

trait DD extends BB {  

println("D....")

}

class EE {//

println("E...")

}

class FF extends EE with CC with DD {

printlnf"F...")

}

class KK extends EE {  先把继承类部分搞定然后再混入

println("k....")

}

执行可以看到结果如下

E...

K....

в....

D....

com.atguigu.chapter08. mixin . MixInSeq$$anon$1@1b40d5f0

3、第2种特质构造顺序(在构建对象时,动态混入特质)

(1)调用当前类的超类构造器

(2)当前类构造器

(3)第一个特质构造器的父特质构造器

(4)第一个特质构造器.

(5)第二个特质构造器的父特质构造器,如果已经执行过,就不再执行

(6)第二个特质构造器

(7)...重复5,6的步骤(如果有第3个,第4个特质)

(8)当前类构造器[案例演示]

4、区别分析两种方式对构造顺序的影响

第1种方式实际是构建类对象,在混入特质时,该对象还没有创建。在混入时当作一个整体

第2种方式实际是构造匿名子类,可以理解成在混入特质时,对象已经创建了。

 

二、整理

特质构造顺序

1、介绍

特质也是有构造器的,构造器中的内容由“字段的初始化”

和一些其他语句构成。具体实现请参考“特质叠加”

2、第一种特质构造顺序(声明类的同时混入特质)

混入有两种方式一个是动态混入一个是声明时混入

(1)调用当前类的超类构造器

(2)第一个特质的父特质构造器

(3)第一个特质构造器

(4)第二个特 质构造器的父特质构造器,如果已经执行过,就不再执行。

(5)第二个特质构造器。

(6)重复4,5的步骤(如果有第3个,第4个特质)

(7)当前类构造器[案例演示]

3、第2种特质构造顺序(在构建对象时,动态混入特质)

(1)调用当前类的超类构造器

(2)当前类构造器

(3)第一个特质构造器的父特质构造器

(4)第一个特质构造器.

(5)第二个特质构造器的父特质构造器,如果已经执行过,就不再执行

(6)第二个特质构造器

(7)...重复5,6的步骤(如果有第3个,第4个特质)

(8)当前类构造器[案例演示]

4、区别分析两种方式对构造顺序的影响

第1种方式实际是构建类对象在混入特质时,该对象还没有创建。即做一个整体的创建

第2种方式实际是构造匿名子类,可以理解成在混入特质时,对象已经创建了会先把自己继承的做完

5、代码演示

package com. atguigu. chapter08. mixin

object MixInSeq {

Def main(args: Array[String]): Unit = {

//这时 FF 是这样形式 class FF extends EE with CC with DD

/*

调用当就类的超类构造器

第一个特质的父特质构造器把静态声明当作一个整体对待第一个父构造器是 CC

第一个特质构造器

第二个特质构造器的父特质构造器,如果 已经执行过,日就不再执行

第二个特质构造器

.......重复4, 5的步骤(如果有第3个,第4个特质)

当前类构造器[ 案例演示]

*/

//1. E...

//2. A...

//3. B....

//4. C....

//5. D....

//6. F....

val ff1 = new FF()    

println(ff1)

//val ff2 = new KK() with CC with DD 

//println(ff2)

trait AA{  

println("A...")

}

trait BB extends AA {  

println(B....")

}

trait CC extends BB {   

println("C....")

}

trait DD extends BB {  

println("D....")

}

class EE {//普通类

println("E...")

}

class FF extends EE with CC with DD { //先继承了EE类, 然后再继承cc和DD

printlnf"F...")

}

class KK extends EE { //KK直接继承了普通类

println("K....")

}

val ff1 = new FF()    

println(ff1)

//这时我们是动态混入

/*

调用当前类的超类构造器

当前类构造器

第一个特质构造器的父特质构造器

第一个特质构造器

第二个特质构造器的父特质构造器,如果已经执行过,就不再执行

第二个特质构造器

......重复5, 6的步骤(如果有第3个,第4个特质)

当前类构造器[ 案例演示]

*/

//1.E...

//2.K...

//3.A...

//4.B

//5.C

//6.D

println(''==========================" )

val ff2 = new KK() with CC with DD  

println(ff2)

trait AA{  

println("A...")

}

trait BB extends AA {  

println(B....")

}

trait CC extends BB {   

println("C....")

}

trait DD extends BB {  

println("D....")

}

class EE {//

println("E...")

}

class FF extends EE with CC with DD {

printlnf"F...")

}

class KK extends EE {  

println("k....")

}

相关文章
|
数据库连接 Python
Python中的异常处理除了Try语句,你还会啥?
Python中的异常处理除了Try语句,你还会啥?
253 1
|
JSON 数据格式 C++
C++ JSON库 nlohmann::basic_json::array 的用法
C++ JSON库 nlohmann::basic_json::array 的用法
1320 1
|
存储 运维 监控
一文带你走进CI/CD
​ 前言: 前几天在阿里云的大咖问答板块瞎逛 遇到一个同学的问题吸引到了我:CI/CD Not Found? 我心想:什么是 CI/CD? 虽然很丢人,但咱也不能说谎不是。赶紧学习才是正道。   目录 一、CI/CD 的概述 CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。 CI/CD 的核心概念是持续集成、持续交付和持续部署。它是作为一个面向开发和运营团队的解决方案,主要针对在集成新代码时所引发的问题(也称为:“集成地狱”)。 CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。 这些关联
1016 1
一文带你走进CI/CD
|
算法 API
视觉智能平台时不时报这个问题,是不稳定吗?
视觉智能平台时不时报这个问题,是不稳定吗?
132 1
|
存储 API 对象存储
带你读《存储漫谈:Ceph原理与实践》——3.2.6 未来展望
带你读《存储漫谈:Ceph原理与实践》——3.2.6 未来展望
|
Java Python Windows
Python pip 源设置成国内源,阿里云源,清华大学源,最方便的方式,都在这里了
Python pip 源设置成国内源,阿里云源,清华大学源,最方便的方式,都在这里了
82374 1
|
JavaScript
(富文本常用)js遇到需要正则匹配来修改img标签+清除行内样式
(富文本常用)js遇到需要正则匹配来修改img标签+清除行内样式
652 0
|
前端开发 程序员 C#
【C#】通过扩展对象的方式,对字符串等数据类型进行数据进一步处理
在本篇文章中,我们讲一起了解下对象扩展的使用 在实际项目开发中,对象扩展使用的场景还是挺多的,比如:需要对时间值进行再处理,或者字符串中的斜杠(/)转为反斜杠(\)
|
数据库
Rafy 框架 - 插件级别的扩展点
本章说明如何使用额外的插件(如客户化插件)对另一插件(如产品插件)进行扩展。   使用场景 在 产品线工程 中,项目的研发分为领域工程和应用工程。这个过程中会需要对领域工程中的内容进行大量的扩展。
956 0