本章要点:
- 用对象作为单例或存放工具方法
- 类可以拥有一个同名的伴生对象
- 对象可以扩展类和特质
- 对象的apply方法通常用来构造伴生类的新实例
- 如果不想显式定义main方法,可以扩展App特质的对象
- 可以通过扩展Enumeration对象来实现枚举
1.单例对象
Scala没有静态方法或静态字段,用object语法结果来达到同样的目的。
object Accounts{
private var lastNumber = 0
def newUniqueNumber() = {lastNumber += 1;lastName}
}
对象的构造器在该对象第一次被使用时调用。在本例中,Account.newUniqueNumber()
的首次调用时执行。如果一个对象从未被使用,那么其构造器也不会被执行。
对象本质上可以拥有类的所有特性,但是不能为他提供构造参数。
2.伴生对象
在C++或者Java中,会用到既有实例方法又有静态方法的类。在Scala中,可以通过类与类同名的伴生对象来达到相同的目的。
class Account{
val id = Account.newUniqueNumber()
}
object Account{
private var lastNumber = 0
private def newUniqueNumber() = {}
}
类和它的伴生对象可以相互访问私有性质,他们必须存在于同一个源文件中。类的伴生对象的功能特性并不在类的作用域内。所以看上面的代码可以发现,class中调用newUniqueNumber
带了Account.
的前缀。
3.扩展类或特质的对象
一个object
可以扩展类以及一个或者多个特质,其结果是一个扩展了定义类以及特质的类的对象,同时拥有在对象定义中给出的所有特性。
4.apply方法
我们通常会定义和使用对象的apply方法。当遇到如下形式的表达式时,apply方法就会被调用:Object(参数1,参数2,……,参数N)
,其返回的是伴生类的对象
Array("Marry","had","a","little","lamb")//不需要构造器就可以创建Array
注意:Array(100)和new Array(100)
是有区别的,前者表示有一个元素为100的数组,而后者是申请一个空间为100的数组,是100个null。
5.应用程序对象
每一个Scala程序都是从一个对象的main方法开始,这个方法的类型为
Array[String]=>Unit:
object Hello{
def main(args:Array[String]){
println("Hello,World!")
}
}
除了每次提供自己的main方法以外,还可以扩展App特质,将程序代码放入构造器方法体类,如果要获取命令行参数,则可以通过args
属性。
6.枚举
Scala没有枚举类型。标准类库提供了一个Enumeration助手类,可以用来产出枚举。
定义一个扩展Enumeration类的对象并以Value方法调用初始化枚举中的所有可选值。
object TrafficLight Color extend Enumeration{
val Red,Yellow,Green = Value
}
然后我们可以通过Value调用将他们初始化
val Red = Value
val Yellow = Value
val Green = Value
还可以向Value方法传入ID,名称,或者两个参数都传:
val Red = Value(0,"stop")
val Yellow = Value(10)
val Green = Value("Go")