object
object 相当于 class 的单个实例,通常在里面放一些静态的 field 或者 method 。
第一次调用 object 的方法时,就会执行 object 的 constructor ,也就是 object 内容的不在 method 中的代码,但是 object 定义接受参数的 constructor 。
object 的 constructor 只会在起第一次被调用时执行一次,以后再次调用就不会再次执行 constructor 。
object 通常用于作为单例模式的实现或者放在 class 的静态成员。
代码语言:javascript复制object Person{
private var eyeN = 2
println("this is Object.")
def getEyeN = eyeN
}
伴生对象
如果有一个 class 和一个与其同名的 object ,那么称这个 object 是 class 的伴生对象,class 是 object 的伴生类。
伴生类和伴生对象必须存放在一个 .scala 文件之中。
伴生类和伴生对象最大的特点在于可以互相访问 private field 。
代码语言:javascript复制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 也可以继承抽象类,并覆盖抽象类中的方法。
代码语言:javascript复制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 对象的功能。
代码语言:javascript复制val a = Array(1,2,3,4)
main 方法
在 scala 中,如果运行一个应用程序,需要一个 main 方法作为入口。
scala 中的 main 方法定义为 def main(args:Array[String]) ,而且必须定义在 object 中。
代码语言:javascript复制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 来实现枚举功能
代码语言:javascript复制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)