Scala比Java更为面向对象的特点之一是scala不能定义静态成员,而是代之以定义单例对象。除了用object关键字替换了class关键字以外,单例对象的定义看上去与类定义一致。
当单例对象与某个类共享同一个名称时,它就被称为是这个类的伴生对象。类和它的伴生对象必须定义在一个源文件里。类被称为是这个单例对象的伴生类。类和它的伴生对象可以互相访问其私有成员。如例:
结果:
对于Java程序员来说,可以把单例对象当作是Java中可能会用到的静态方法工具类。也可以用类似的语法做方法调用: 单例对象类 . 方法名,如上例:
Test1.show4("class")然而单例对象不只是静态方法工具类。它同样是头等的对象。定义单例对象并没有定义类型(在scala的抽象层次上说)。如果只有Test1对象的定义,就不能建立Test1类型的变量。或者可以认为,Test1类型是由单例对象的伴生类定义的。类和单例对象间的差别
单例对象不带参数,而类可以。因为单例对象不是用new关键字实例化的,所以没机会传递给它实例化参数。每个单例对象都被实现为虚构类(synthetic class)的实例,并指向静态的变量,因此它们与Java静态类(静态内部类??)有着相同的初始化语义。特别要指出的是,单例对象在第一次被访问的时候才会被初始化。注:虚构类的名字是对象名加上一个美元符号($)。因此单例对象Test1的虚构类是:Test1$。另外,没有伴生类的单例对象被称为独立对象。它可以用在很多地方,例如作为相关功能方法的工具类,或者定义scala应用的入口点。