Published: 09 Aug 2016 Category: scala
object Accounts { private var lastNumber = 0 def newUniqueNumber() = { lastNumber += 1; lastNumber } }
对象的构造器在该对象第一次被使用时调用,如Accounts.newUniqueNumber()首次调用时执行构造器,如果一个对象从未被使用,那么构造器也不会执行
对象的本质上可以拥有类的所有特性,甚至可以扩展其他类或特质
只有一个例外,不能提供构造器参数
在java中,类可以有实例方法又可以有静态方法。在scala中,可以通过类和与类同名的伴生对象达到目的
class Account { val id = Account.newUniqueNumber() private var balance = 0.0 def deposit(amount: Double) { balance += amount } } object Account { //伴生对象 private var lastNumber = 0 def newUniqueNumber() = { lastNumber += 1; lastNumber } }
类和它的伴生对象可以相互访问私有特性,但必须在同一个源文件中
类的伴生对象可以被访问,但并不在作用域当中,必须通过Account.newUniqueNumber()而不是直接用newUniqueNumber()
对象的apply方法,当遇到Object(参数1,…,参数N),apply方法就会被调用
class Account private (val id: Int, initialBalance: Double) { private var balance = initialBalance ... } object Account { //伴生对象 def apply(initialBalance: Double) = new Account(newUniqueNumber(),initialBalance) ... }
这样就可以用val acct = Account(1000.0)构造了
应用程序对象
object Hello { def main(args: Array[String]) { //doWork } }
object Hello extends App { //doWork } //命令行参数通过args获取 object Hello extends App { if (args.length > 0) //doWork else //doWork }