object

object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method 。

第一次调用 object 的方法时,就会执行 object 的 constructor ,也就是 object 内容的不在 method 中的代码,但是 object 定义接受参数的 constructor 。

object 的 constructor 只会在起第一次被调用时执行一次,以后再次调用就不会再次执行 constructor 。

object 通常用于作为单例模式的实现或者放在 class 的静态成员。

object Person{
private var eyeN = 2
println("this is Object.")
def getEyeN = eyeN
}
伴生对象

如果有一个 class 和一个与其同名的 object ,那么称这个 object 是 class 的伴生对象,class 是 object 的伴生类。

伴生类和伴生对象必须存放在一个 .scala 文件之中。

伴生类和伴生对象最大的特点在于可以互相访问 private field 。

object Person{
private val eyeNum = 2
def getEyeNum = eyeNum
}
class Person(val name:String, val age:Int){
def sayHello = println("Hi," + name + " you are " + age + "years old." + "You have " + Person.eyeNum + "eyes.")
}
object 继承抽象类

object 的功能是其和 class 类似,除了不能定义接受参数的 constructor 之外,object 也可以继承抽象类,并覆盖抽象类中的方法。

abstract class Hello(var message:String){
def sayHello(name:String):Unit
}

object HelloImpl extends Hello("hello"){
override def sayHello(name:String) = {
println(message + " ," + name)
}
}
apply 方法

apply 方法是 object 中非常重要的一个特殊方法。

通常在伴生对象中实现 apply 方法,并在其中实现构造伴生类的对象的功能。

创建伴生类的对象时,通常不会使用 new Class 的方式,而是使用 Class() 的方式,隐式地调用伴生对象的 apply 方法。

比如,Array 类的伴生对象 apply 方法就实现了接受可变数量的参数,并创建一个 Array 对象的功能。

val a = Array(1,2,3,4)
main 方法

在 scala 中,如果运行一个应用程序,需要一个 main 方法作为入口。

scala 中的 main 方法定义为 def main(args:Array[String]) ,而且必须定义在 object 中。

object HelloWord{
def main(args:Array[String]){
println("Hello!")
}
}

除 了自己实现 main 方法之外,还可以继承 App Trait,然后将需要在 main 方法中运行的代码,直接作为 object 的constructor 代码,而且用 agrs 可以接受传入的参数。

App Trait 工作原理:App Trait 继承自 DelayedInit Trait, scalac 命令进行编译时,会把继承 App Trait 的 object 的 constructor 代码都放到 DelayedInit Trait 的 delayedInit 方法中执行。

用 object 来实现枚举功能

object Season extends Enumeration {
val SPRING,SUMMER,AUTUMN,WINTER = Value
}

// 还可以通过 value 传入枚举值的 id 和 name ,通过 id 和 toString 来获取。
// 可以通过 id 和 name 来查询枚举值
object Season extends Enumeration {
val SPRING = Value(0,"spring")
val SUMMER = Value(1,"summer")
val AUTUMN = Value(2,"autumn")
val WINTER = Value(3,"winter")
}
// 访问
Season(0)
Season.withName("spring")

// 使用增强 for 循环来遍历
for (ele <- Season.values) println(ele)