Scala基础知识6

一,抽象类

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 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找。

可变集合继承图

​​​​​​​数组

不可变数组

​​​​​​​可变数组

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

相关推荐
Asthenia04124 小时前
Spring AOP 和 Aware:在Bean实例化后-调用BeanPostProcessor开始工作!在初始化方法执行之前!
后端
Asthenia04125 小时前
什么是消除直接左递归 - 编译原理解析
后端
Asthenia04125 小时前
什么是自上而下分析 - 编译原理剖析
后端
Asthenia04125 小时前
什么是语法分析 - 编译原理基础
后端
Asthenia04125 小时前
理解词法分析与LEX:编译器的守门人
后端
uhakadotcom5 小时前
视频直播与视频点播:基础知识与应用场景
后端·面试·架构
Asthenia04126 小时前
Spring扩展点与工具类获取容器Bean-基于ApplicationContextAware实现非IOC容器中调用IOC的Bean
后端
bobz9657 小时前
ovs patch port 对比 veth pair
后端
Asthenia04127 小时前
Java受检异常与非受检异常分析
后端