第六章
包
包的作用
- 区分相同名字的类
- 当类很多时,可以很好的管理类
- 控制访问范围
包的命名
- 只能包含数字、字母、下划线,但不能用数字开头,也不要使用关键字
- 一般是小写字母+小圆点,eg:com.公司名.项目名.业务模块名
包对象
在scala中可以为每个包定义一个同名的包对象,定义在包对象中的成员,作为其对应包下所有class和object的共享变量,可以被直接访问



导包说明
- 使用import导入,文件内所有的类都可以使用
- 通配符导入:import java.util._,将所有类导入进来
- 给类起别名:import java.util.{ArrayList=>AL}
- 导入相同包的多个类:import java.util.{ArrayList,HashSet}
- 屏蔽类:import java.util.{ArrayList=>_,_}
scala中的三个默认导入的包:
- import java.lang._
- import scala._
- import scala.Predef._
类和对象
定义类:
[修饰符] class 类名 {
类体
}
定义属性:
属性是类的一个组成部分
[修饰符] var 属性名称 [:类型] = 属性值
定义方法:
def 方法名(参数列表) [:返回值类型] = {
方法体
}
创建对象:
val | var 对象名 [:类型] = new 类型()
- Scala语法中,类并不声明为public,所有这些类都具有公有可见性
- 一个Scala源文件可以包含多个类

封装
封装就是把抽象出的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作,才能对数据进行操作
访问权限
- scala 中属性和方法的默认访问权限为public,但scala中无public关键字
- private为私有权限,只在类的内部和伴生对象中可用
- protected为受保护权限,Scala中受保护权限比Java中更严格,同类、子类可以访问,同包无法访问
- private[包名]增加包访问权限,包名下的其他类可以使用

构造器
Scala构造对象也需要调用构造方法,并且可以有任意多个构造方法。
Scala类的构造器包括:主构造器和辅助构造器
基本语法:
class 类名(形参列表) { // 主构造器
// 类体
def this(形参列表) { // 辅助构造器
}
def this(形参列表) { //辅助构造器可以有多个...
}
}
(1)辅助构造器,函数的名称this,可以有多个,编译器通过参数的个数来区分。
(2)辅助构造方法不能直接构建对象,必须直接或者间接调用主构造方法。


构造器参数
- 未用任何修饰
- 未用任何修饰符修饰,这个参数就是一个局部变量
- var修饰
- var修饰参数,作为类的成员属性使用,可以修改
- val修饰
- val修饰参数,作为类只读属性使用,不能修改

继承
基本语法:
class 子类名 extends 父类名 { 类体 }
(1) 子类继承父类的属性和方法
(2) scala是单继承
(3) 继承的调用顺序:父类构造器->子类构造器

多态
多态是指同一个操作可作用于不同的对象

抽象属性和抽象方法
- 抽象类
- 通过abstract关键字标记抽象类
- 抽象属性
- 一个属性没有初始化,就是抽象属性
- 抽象方法
- 只声明而没有实现的方法,就是抽象方法
继承&重写
- 如果父类为抽象类,那么子类需要将抽象的属性和方法实现,否则子类也需声明为抽象类
- 重写非抽象方法需要用override修饰,重写抽象方法则可以不加override
- 子类中调用父类的方法使用super关键字
- 属性重写只支持val类型,而不支持var

匿名子类
直接在实例中重写属性和方法

单例对象(伴生对象)
Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概念),但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象来模拟类对象,该对象称为单例对象。若单例对象名与类名一致,则称该单例对象这个类的伴生对象,这个类的所有“静态”内容都可以放置在它的伴生对象中声明
- 单例对象采用object关键字声明
- 单例对象对应的类称之为伴生类,伴生对象的名称应该和伴生类名一致
- 单例对象中的属性和方法都可以通过伴生对象名(类名)直接调用访问

apply方法
- 通过伴生对象的apply方法,实现不使用new方法创建对象
- 如果想让主构造器变成私有的,可以在()之前加上private
- apply方法可以重载
- Scala中obj(arg)的语句实际是在调用该对象的apply方法,即obj.apply(arg)

单例模式
单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类仅有一个实例,并提供一个全局访问点来获取该实例

特质
Scala语言中,采用特质trait(特征)来代替接口的概念,也就是说,多个类具有相同的特征(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明,Scala中的trait中即可以有抽象属性和方法,也可以有具体的属性和方法,一个类可以混入(mixin)多个特质
特质声明
trait 特质名 {
trait体
}
基本语法
一个类具有某种特质(特征),就意味着这个类满足了这个特质(特征)的所有要素,所以在使用时,也采用了extends关键字,如果有多个特质或存在父类,那么需要采用with关键字连接
基本语法:
没有父类:class 类名 extends 特质1 with 特质2 with 特质3 …
有父类:class 类名 extends 父类 with 特质1 with 特质2 with 特质3…
- 类和特质的关系:使用继承的关系
- 当一个类去继承特质时,第一个连接词是extends,后面是with
- 如果一个类在继承特质和父类时,应当把父类写在extends后

动态混入
- 一个类可以混入(mixin)多个特质
- 动态混入:创建对象时混入trait,而无需使类混入该trait
- 如果混入的trait中有未实现的方法,则需要实现

特征叠加
由于一个类可以混入(mixin)多个trait,且trait中可以有具体的属性和方法,若混入的特质中具有相同的方法(方法名,参数列表,返回值均相同),必然会出现继承冲突问题
- 解决冲突的方法
- 直接在类中重写冲突方法

自身类型
自身类型可实现依赖注入的功能

3346

被折叠的 条评论
为什么被折叠?



