object
object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method 。
第一次调用 object 的方法时,就会执行 object 的 constructor ,也就是 object 内容的不在 method 中的代码,但是 object 定义接受参数的 constructor 。
object 的 constructor 只会在起第一次被调用时执行一次,以后再次调用就不会再次执行 constructor 。
object 通常用于作为单例模式的实现或者放在 class 的静态成员。
伴生对象
如果有一个 class 和一个与其同名的 object ,那么称这个 object 是 class 的伴生对象,class 是 object 的伴生类。
伴生类和伴生对象必须存放在一个 .scala 文件之中。
伴生类和伴生对象最大的特点在于可以互相访问 private field 。
object 继承抽象类
object 的功能是其和 class 类似,除了不能定义接受参数的 constructor 之外,object 也可以继承抽象类,并覆盖抽象类中的方法。
apply 方法
apply 方法是 object 中非常重要的一个特殊方法。
通常在伴生对象中实现 apply 方法,并在其中实现构造伴生类的对象的功能。
创建伴生类的对象时,通常不会使用 new Class 的方式,而是使用 Class() 的方式,隐式地调用伴生对象的 apply 方法。
比如,Array 类的伴生对象 apply 方法就实现了接受可变数量的参数,并创建一个 Array 对象的功能。
main 方法
在 scala 中,如果运行一个应用程序,需要一个 main 方法作为入口。
scala 中的 main 方法定义为 def main(args:Array[String]) ,而且必须定义在 object 中。
除 了自己实现 main 方法之外,还可以继承 App Trait,然后将需要在 main 方法中运行的代码,直接作为 object 的constructor 代码,而且用 agrs 可以接受传入的参数。
App Trait 工作原理:App Trait 继承自 DelayedInit Trait, scalac 命令进行编译时,会把继承 App Trait 的 object 的 constructor 代码都放到 DelayedInit Trait 的 delayedInit 方法中执行。
用 object 来实现枚举功能