一,抽象类
1.抽象类与继承
抽象类定义:使用 abstract关键字定义抽象类,抽象类中可以包含抽象属性和抽象方法。
抽象属性:未初始化的属性即为抽象属性,使用a1或va 定义。
抽象方法:声明但不实现的方法即为抽象方法,使用 det 定义。
继承与重写:子类必须实现父类的抽象属性和方法,否则子类也需声明为抽象类。重写非抽象方法需使用override 关键字,重写抽象方法则不需要。
子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var。
因为 var 修饰的为可变变量,子类继承之后就可以直接使用,没有必要重写

2.匿名子类与单例对象
匿名子类:通过重写代码块的形式创建匿名子类,不需要新的类名。

单例对象:使用obiect 关键字声明,模拟静态对象的行为。单例对象中的属性和方法可以通过类名或对象名直接调用。
若单例对象名与类名一致,则称该单例对象这个类的伴 生对象 ,这个类的所有"静态"内容都可以放置在它的伴生对象中声明.
单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致。
单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问。

3.apply 方法:
1.通过伴生对象的 apply 方法可以实现不使用 new 关键字创建对象。
2.如果想让主构造器变成私有的,可以在()之前加上 private。
3.apply 方法可以重载。
4.Scala 中 obj(arg) 的语句实际是在调用该对象的 apply 方法,即 obj.apply(arg)。用以统一面向对象编程和函数式编程的风格。
5.当使用 new 关键字构建对象时,调用的其实是类的构造方法,当直接使用类名构建对象时,调用的其实时伴生对象的 apply 方法。
注意:也可以创建其它类型对象,并不一定是伴生类对象

4.特质 ( Trait )
Scala 语言中,采用特质 trait(特征)来代替接口的概念,也就是说,多个类具有相同的特质(特征)时,就可以将这个特质(特征)独立出来,采用关键字 trait 声明。
特质定义:使用 trait关键字定义特质,特质可以包含抽象属性和方法,也可以包含具体属性和方法。

特质继承:类可以通过 extends。关键字继承特质,多个特质使用with 关键字连接。
特质可以同时拥有抽象方法和具体方法。


特质叠加:一个类可以混入多个特质,若有方法冲突,
第一种,一个类(Sub)混入的两个 trait(TraitA,TraitB)中具有相同的具体方法,且两个 trait 之间没有任何关系,解决这类冲突问题,直接在类(Sub)中重写冲突方法。

第二种,一个类(Sub)混入的两个 trait(TraitA,TraitB)中具有相同的具体方法,且两个 trait 继承自相同的 trait(TraitC),及所谓的"钻石问题",解决这类冲突问题,Scala 采用了特质叠加的策略。


特质叠加的执行顺序与定义顺序相反。
特质自身类型:自身类型可实现依赖注入的功能.

特质与抽象类的区别;特质可以扩展多个,而抽象类只能扩展一个;抽象类可以定义带参数的构造函数,而特质不行。
二,扩展
类型检查和转换



枚举类和应用类
枚举类:需要继承 Enumeration
应用类:需要继承App

Type 定义新类型
使用 type 关键字可以定义新的数据数据类型名称,本质上就是类型的一个别名.

三,集 合
集合分类:集合主要分为序列(Seq)、集(Set)和映射(Map)三大类,所有的集合都扩展自 Iterable特质。
对于几乎所有的集合类,Scala 都同时提供了可变 和不可变的版本,分别位于以下两个包

Scala 不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象, 而不会对原对象进行修改。类似于 java 中的 String 对象。
可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类似于 java 中 StringBuilder 对象。
建议:在操作集合的时候,不可变用符号,可变用方法
不可变集合继承图

Set、Map 是 Java 中也有的集合。
ndexedSeq 和LinearSeq 的区别:
IndexedSeq 是通过索引来查找和定位,因此速度快,比如String 就是一个索引集合,通过索引即可定位。
LinearSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找。
可变集合继承图

数组
不可变数组




可变数组


不可变数组与可变数组的转换

