开发者学堂课程【Scala 核心编程-基础:温故知新】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/9014
温故知新
内容介绍
一、动态混入
二、叠加特质
三、特质构造顺序
四、扩展类的特质
五、嵌套类
六、类型投影
七、隐式转换
一、动态混入
1、使用方式和基本语法,需要了解,动态混入的基本语法如下:
val oracleDB = new OracleDB with Operate3
用with关键字直接将需要混入的特质混进去,如果有多个需要混入,就在后面加 with 特质即可。
2、动态混入的好处是可以实现 ocp 原则,开闭原则,就是在用动态混入的方式给一个对象增加功能时,并不会影响类的本身,这是动态混入最基本的原则和规则。
二、叠加特质
1、叠加特质是混入时有多个特质,一旦实现混入多个特质,就有很多语法规则需要去遵守,这里面有两个规则特别重要,第一个在混入时,它的构建顺序是什么,第二个当叠加特质之后,执行叠加过后产生的方法时,它的执行方法顺序是什么。这是一个考点,也是看源代码的核心点。
2、叠加特质的构建顺序?执行方法顺序?在这里面用到的 super 关键字是什么?
叠加特质的构建顺序是从左往右,在构建过程中它仍然遵循如果构建时混入特质,父特质也要往上追。执行方法的顺序是从右往左,如果在这个过程中让 super 指向父特质,在 super 后面加上中括号,里面写它父特质的名称。
3、如果想要调用具体特质的方法,可以指定: super[特质(.xxx(···),其中的泛型必须是该类的直接超类类型。
三、特质构造顺序
在进行混入时,它首先混入的类也有构造器时要注意顺序,第一种和第二种主要的区分是,第一种声明类的同时混入特质,先是把它当作一个整体,在混入时这个对象并没有创建成功,所以它是按照声明的混入顺序一步一步构建的,第二种在构建对象时,动态混入特质,可以理解成先把对象创建好之后,再逐一混入特质。
四、扩展类的特质
一个特质可以继承另外一个类,特质就可以用继承这个类的方法,相当于扩展了 trait 的功能,在扩展功能之后,用混入的方式混入特质时,那么对象就拥有了相应的功能。这就是扩展类的特质。
五、嵌套类
1、嵌套类更多的情况是源码会用到,一般情况下在开发时应当避免使用到嵌套类,实际上如果真的用到嵌套类,说明水平很高,做 java 开发很少用到内部类,更多的是用来看源码,可能有面试的时候会问到。
2、scala 嵌套类和 java有什么区别?有两点区别,第一个是嵌套类的对象是跟外部的对象相关的,java 是创建一个内部类的对象,它只跟内部类型有关系,在 scala 中,Scala 创建内部类的方式和 Java 不一样,将 new 关键字放置在前,使用对象.内部类的方式创建,说明内部类或者是嵌套类,它其实跟外部外部对象有密切关系,但是 java 不是这样的,java 只能内部类型有关系,直接导致一个问题,如何解决这个问题?在 scala 中提供了类型投影解决这个问题。
六、类型投影
前面加上外部类的名称,加#号,再写上内部类的名字,这样称之为类型投影,它的作用就是屏蔽外部对内部对象的影响。
七、隐式转换
1、隐式转换在看代码时,有时输入一个值,但是可以通过,其实是隐式转换起了很大的作用。
2、比如 val num: Int=3.5,把3.5给了 int,写一个隐式转换的函数。
implicit def f1(d:Double): Int=
{
//底层
生成
f1$1
d.toInt
}
它把隐式函数作用在3.5上,因此在看源代码看不懂时,可以反编译查看。
3、idea ,就是只要看到有实线的下划线,一定会出现隐式转换。