class和object都可以定义自己的apply()方法,类名()调用object下的apply()方法,实例对象()调用class下的apply()方法。
Scala不能定义静态成员,而是代之定义单例对象(singleton object)。以object关键字定义。
独立对象(standalone object)
不与伴生类共享名称的单例对象称为独立对象。它可以用在很多地方,例如作为相关功能方法的工具类,或者定义Scala应用的入口点。
伴生对象(companion object)
当单例对象与某个类共享同一个名称时,它就被称为是这个类的伴生对象(companion
object)。类和它的伴生对象必须定义在同一个源文件中。类被称为是这个单例对象的伴生类(companion
class)。类和它的伴生对象可以互相访问其私有成员。
在下面几个场景下可以使用Scala单例对象:
类和单例对象间的差别是,单例对象不带参数,而类可以。因为单例对象不是用new关键字实例化的,所以没机会传递给它实例化参数
class ApplyTest{
def apply() {
println("This is a class, apply()...")
}
}
object ApplyTest{
def apply() = {
println("This is an object, apply()...")
new ApplyTest()
}
}
object ApplyExample {
def main(args: Array[String]) {
var at=ApplyTest()
at()
}
}
var at=ApplyTest()
这是类名(),调用的是Object下的Apply()方法,由于此时并没有创建类的对象,所以也只能调用Object下的静态方法。
at()
这是变量名(),显然调用的是Class的Apply()方法
对于apply方法,可以直接调用,不用对象.方法名(又名:语法糖)
package Onedayhelloscala
object TestApply {
def apply(food:String) ={
println("Eat"+food)
}
}
TestApply("meat")