QuicklyStudyScala_6

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")  
  }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值