ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 1. 单例对象 - scala中没有静态方法或静态变量,可以使用object达到同样的目的。 ~~~ object Accounts { private var lastNumber = 0 def newUniqueNumber() = { lastNumber += 1; lastNumber } } ~~~ - 对象的构造器在该对象第一次被使用时调用。 - scala对象可以用来实现: > 1. 存放工具函数或常量 > 1. 共享单个不可变实例 > 1. 需要用单个实例协调某个服务 ### 2. 伴生对象 - JAVA中会既有实例方法又有静态方法的类,Scala中用类和与类同名的“伴生”对象实现。 ~~~ class Account { val id = Account.newUniqueNumber() private var balance = 0.0 def deposit(amount: Double) { balance += amount } def description = "Account " + id + " with balance " + balance } object Account { // 伴生对象 private var lastNumber = 0 private def newUniqueNumber() = { lastNumber += 1; lastNumber } } val acct1 = new Account val acct2 = new Account acct1.deposit(1000) val d1 = acct1.description val d2 = acct2.description ~~~ - 类和它的伴生对象可以相互访问私有特征。 **总结**:个人理解,scala中引入object就是为了解决没有静态变量或静态方法的问题。 ### 3. 扩展类或特质的对象 - 一个object可以扩展类以及一个或多个特质。 ~~~ abstract class UndoableAction(val description: String) { def undo(): Unit def redo(): Unit } object DoNothingAction extends UndoableAction("Do nothing") { override def undo() {} override def redo() {} } val actions = Map("open" -> DoNothingAction, "save" -> DoNothingAction) actions("open") == actions("save") ~~~ ### 4. apply方法 - 不使用new,而直接使用object(参数1,…,参数N),这时候apply方法会被调用。 ~~~ class Account private (val id: Int, initialBalance: Double) { private var balance = initialBalance def deposit(amount: Double) { balance += amount } def description = "Account " + id + " with balance " + balance } object Account { // The companion object def apply(initialBalance: Double) = new Account(newUniqueNumber(), initialBalance) private var lastNumber = 0 private def newUniqueNumber() = { lastNumber += 1; lastNumber } } val acct = Account(1000.0) val d = acct.description ~~~ ### 5. 应用程序对象 - scala程序都是从对象main方法开始 ~~~ object Hello { def main(args: Array[String]) { println("Hello, World!") } } ~~~ - 保存为Hello.scala文件,执行:scalac Hello.scala编译文件,执行:scala Hello运行程序。 ### 6. 枚举 - scala 中没有枚举类型,但有枚举类,Enumeration ~~~ object TrafficLightColor extends Enumeration { val Red, Yellow, Green = Value } TrafficLightColor.Red TrafficLightColor.Red.id object TrafficLightColor extends Enumeration { val Red = Value(0, "Stop") val Yellow = Value(10) // Name "Yellow" val Green = Value("Go") // ID 11 } ~~~ - Value中可以不传值,可以传入ID、名称。 - 枚举的ID可以通过id方法返回,名称通过toString方法返回。 【待续】