class QuicklyStudyScala_6 {
def main(args: Array[String]) {
//使用scala语法结构, object的语法结构
//在你需要某个类的单个实例时,或者想为其他值或函数找一个可以挂靠的地方时,就会用到它
// 单例对象
//scala没有静态方法或静态字段, 可以用object这个方法结构来达到同样目的,
object Accounts {
private var lastNumber = 0
def newUniqueNumber() = { lastNumber += 1; lastNumber }
}
//应用程序中需要一个新的唯一账号时,调用 Account.newUniqueNumber()即可
//对象的构造器在该对象第一次被 使用时调用
//对象本质上可以拥有类的所有特性,它甚至可以扩展其他类或特质,只有一个例外, 你不能提供构造器参数
//在scala中都可以用对象来实现:
//作为存放工具函数或常量的地方
//高效地共享单个不可变的实例
//需要用单个实例来协调某个服务时
//伴生对象
//如同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
private def newUniqueNumber() = { lastNumber += 1; lastNumber }
}
//类和它的伴生对象可以相互访问私有特性,它们必须存在于同一个源文件中
//类的伴生对象可以被访问,但并不在作用域当中, 如 Account 类必须通过 Account.newUniqueNumber()而不是直接用newUniqueNumber()来调用伴生对象的方法
//扩展类或特质的对象
//一个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);
//apply 方法
//定义和使用的apply方法, Object(参数1,参数2)
//Array对象定义了apply方法
Array("Mary", "had", "a", "little", "lamb")
//对于嵌套表达式
Array(Array(1, 7), Array(2, 9))
// Array(100) 调用apply(100)方法,输出一个单元素(整数100) 的Array[Int]
// new Array(100) 调用构造器 this(100), 结果是Array[Nothing], 包含了100个null元素
//定义apply方法的示例
class AccountTest private (val id: Int, initialBalance: Double) {
private var balance = initialBalance
}
object AccountTest { //伴生对象
private var lastNumber = 0
private def newUniqueNumber() = { lastNumber += 1; lastNumber }
def apply(initialBalance: Double) = new AccountTest(newUniqueNumber(), initialBalance)
}
//构建帐户
val acct = AccountTest(1000.0)
//应用程序对象
//每个scala程序都必须从一个对象 main 方法开始, 这个方法的类型为 Array[String] => Unit
object Hello {
def main(args: Array[String]) {
println("Hello, World!");
}
}
//也可以扩展App特质,
object HelloApp extends App {
println("Hello, World!");
}
//命令行参数,通过 args 属性得到
object HelloApp1 extends App {
if (args.length > 0) {
println("Hello, " + args(0))
} else {
println("Hello, World!")
}
}
//枚举
//scala没有枚举类型, 标准库提供了一个Enumeration助手类,可以用于产生枚举
//定义一个扩展Enumeration类的对象,并以value方法调用初始化枚举中的所有可选值
object TrafficLightColor extends Enumeration {
// val Red = Value
// val Yellow = Value
// val Green = Value
val Red, Yellow, Green = Value
//调用Value方法都返回内部类的新实例, 该内部类也叫做 Value
//或向 Value方法传入ID, 名称, 或两个参数都传
// val Red = Value(0, "Stop")
// var Yellow = Value(10) // 名称为"Yellow"
// val Green = Value("Go") //ID 为 11
//如果不指定, 则ID在将一个枚举值基础上加一,从零开始, 缺省名称为字段名
//定义完成之后, 使用 TrafficLightColor.Red TrafficLightColor.Yellow
}
//import TrafficLightColor._ //引入枚举值
//枚举的类型是 TrafficLightColor.Value而不是TrafficLightColor,后者是握有这些值的对象
object TrafficLightColorTest extends Enumeration {
type TrafficLightColorTest = Value
val Red, Yellow, Green = Value
}
//这样,枚举的类型变成了 TrafficLightColor.TrafficLightColor 但仅当你使用import语句时这样做才显得有意义
import TrafficLightColorTest._
def doWhat(color: TrafficLightColorTest) = {
if (color == Red) "stop"
else if (color == Yellow) "hurry up"
else "go"
}
//枚举值的ID可通过id方法返回,名称通过toString方法返回
//对TrafficLightColor.values的调用输出所有枚举值的集
for (c <- TrafficLightColor.values) println(c.id + ": " + c)
//通过枚举的ID或名称来进行查找定位,以下两段代码都输出 TrafficLightColor.Red对象
TrafficLightColorTest(0)
TrafficLightColorTest.withName("Red")
}
}