Scala中对象介绍

 

单例对象

Scala没有静态方法或静态字段,你可以用object这个语法结构来达到同样的目的。对象定义了某个类的单个实例,包含了你想要的特性。例如:

object Accounts {
  private var lastNumber = 0

  def newUniqueNumber = {
    lastNumber += 1
    lastNumber
  }
}

 

对象的构造器在对象第一次使用时被调用。在上面例子中,Accounts的构造器在Accounts.newUniqueNumber的首次调用时执行。如果一个对象从未被使用,那么其构造器也不会被执行。

对象本质上可以拥有类的所有特性,他甚至可以扩展其他类或特质。(只有一个例外,你不能提供构造器参数)

 

伴生对象

在Java或C++中,你通常会用到既有实例方法又有静态方法的类。在Scala中,你可以通过类和类同名的伴生对象来达到同样的目的。例如:

// 只有object 和class 名字一样时才称为伴生对象
class Accounts {
  private var lastNumber = 0

  def newUniqueNumber = {
    lastNumber += 1
    lastNumber
  }

}

 

类和他的伴生对象可以相互访问私有的特性,并且他们必须存在同一个源文件中。

 

注意:类的伴生对象可以被访问,但并不在作用域中。举例来说,Account类必须通过Account.newUniqueNumber而不是直接调用newUniqueNumber来调用伴生对象的类。

 

扩展类或特质的对象

一个object可以扩展类以及一个或多个特质。其结果是一个扩展了指定类以及特质的类的对象,同时拥有在对象中定义给出的所有特性。

举例来说我们可以创建一个抽象类,然后来创建一个类来继承抽象类:

abstract class UndoableAction {
  def undo = {
  }

  def redo = {
  }
}

object DoNothingAction extends UndoableAction {
  override def undo: Unit =println("undo")
  override def redo: Unit = println("redo")
}
//DoNothingAction 可以被所有需要这个行为的地方共用

 

apply方法

我们通常会定义和使用对象的apply方法。当遇到以下情况时,apply方法就会被调用:

// Array对象定义了apply方法,我们可以直接使用下面的表达式来创建数组
Array("jason","jack","mark")

 

Array(100) 和 new Array(100) 很容易搞混。前一个表达式调用的是apply(100),输出一个单元素(整数100)的Array[Int]。后一个表达式调用的是构造器this(100),结果是Array[Nothing],包含了100个null元素。

 

应用程序对象

 

每个Scala程序都必须从一个对象的main方法开始,这个方法的类型为Array[String] => Unit

object Accounts {
  def main(args: Array[String]): Unit = {
    println("hello world")
  }
}

 

除了每次都提供自己的main方法之外,也可以扩展App特质,将程序代码直接写在构造器方法体内。

 

object Accounts extends App {
  println("hello world")
}

 

枚举

与Java或C++不同,Scala并没有枚举类型。不过标准类库提供了一个Enumeration类,可以用于产生枚举。

定义一个扩展Enumeration类的对象并以value方法调用初始化枚举中的所有可选值。例如:

object TrafficLightColor extends Enumeration {
  // 定义一个类型别名
  // 枚举的类型就变成了 TrafficLightColor.TrafficLightColor
  type TrafficLightColor = Value
  // 定义三个字段,然后用Value调用将他们初始化
  val RED,YELLOW,GREEN = Value
}



def doWhat(color: TrafficLightColor): Unit = {
  if (color == RED) {
    println("stop")
  } else {
    println("go")
  }
}

 

 

长按识别图中二维码

关注获取更多

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值