在Scala中,没有静态的概念。 所以Scala创建一个单例对象来为程序的执行提供入口点。
怎么理解这句话?就是说你在自己的IDE里写完一个程序,想看看执行结果,因为不像Java一样有静态方法,你直接编译会在控制台界面输出,对于Scala,可以在IDE直接编译,但是不会有输出,如果想看一下程序的输出,那么需要有一个单例对象。
1、单例
单例(Singleton)对象是一个通过使用 object
关键字而不是使用 class
关键字声明的对象。其它对象不需要调用在单例对象中声明的方法。
我们看一下下面这段代码
object Singleton{
def main(args:Array[String]){
SingletonObject.hello() // No need to create object.
}
}
object SingletonObject{
def hello(){
println("Hello, This is Singleton Object")
}
}
// 运行结果
Hello, This is Singleton Object
2、伴生对象
所谓伴生对象, 也是一个Scala中的单例对象, 使用object关键字修饰。 除此之外, 还有一个使用class关键字定义的同名类, 这个类和单例对象存在于同一个文件中, 这个类就叫做这个单例对象的伴生类, 相对来说, 这个单例对象叫做伴生类的伴生对象。
伴生对象和伴生类可以互相访问其私有成员。伴生对象不能被 new
实例化。
伴生对象是用来代替java中的静态成员,静态成员的作用是什么,就相当于是定了一个全局的成员,改一处全局都变,避免有多处调用,要改多处。
class Test{
var field = "field"
def doSomeThing = println("do something")
}
object Test {
val a = "a string";
def printString = println(a)
}
总结一下:
- 伴生类中定义的字段和方法, 对应同类class类中的成员字段和成员方法
- 伴生对象中定义的字段和方法, 对应同名类中的静态方法, 所以可以认为Scala中的object关键字是静态的另一种表示方式, 只是scala将这些静态的东西也封装成了对象
因为我工程实战经验少,对于伴生对象的理解也很浅,到底什么时候可以用,什么时候应该用还没有自己深入的理解,还是那句话,多写代码,实战是检验真理的唯一方法。