Scala对象

单例对象

Scala没有静态方法或静态字段,你可以用object这个语法结构来达到同样目的,

object HelloWorld {
  private var lastNumber = 0
  def newUniqueNumber()={lastNumber+=1;lastNumber}
}

使用的时候直接调用HelloWorld.newUniqueNumber()即可。对象的构造器在该对象第一次被使用时调用,如果一个对象从未被使用,那么其构造器也不会被执行。在Scala中用对象可以来实现:

  • 作为存放工具函数或常量的地方
  • 高效地共享单个不可变实例
  • 需要用单个实例来协调某个服务时

类和它的伴生对象可以相互访问私有特性,它们必须存在于同一个源文件中。调用方式:Account.newUniqueNumber()来调用伴生对象的方法

class Account{
}
object Account{//伴生对象
  private var lastNumber = 0
  private def newUniqueNumber()={lastNumber+=1;lastNumber}
}

apply方法

当Object(参数1,...,参数N),通常这样一个apply方法返回的是伴生类的对象。Array(100)和new Array(100)很容易搞混。前一个调用的是apply(100),输出一个单元素的Array[Int],而第二个调用的是构造器this(100),结果是Array[Nothing],它包含了100个null元素。

应用程序对象

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

object Hello{
    def main(args : Array[String]){
        println()
    }
}

除了每次都提供自己的main方法外,你也可以扩展App特质,然后将程序代码放进构造器方法体内:

object Hello extends App{
    def main(args : Array[String]){
        println()
    }
}

Enumeration

object MyEnum extends Enumeration {
  //定义三个字段,然后用Value调用将它们初始化,每次调用Value都返回内部类的新实例,该内部类也叫做Value,或者你也可以向Value方法传入ID/名称/两个参数都传
  val Red, Yellow, Green = Value
}
object Hi {
  def main(args: Array[String]) {
    //可以通过如下语句直接引入枚举值
    //import MyEnum._
    //记住枚举的类型是MyEnum.Value而不是MyEnum
    //type MyEnum = Value //此句话用来设置类型别名,这样的话,枚举的类型就变成了MyEnum.MyEnum
    //枚举值的ID可通过id方法返回,名称通过toString方法返回,对MyEnum.values的调用输出所有枚举值的集合
    //可以通过枚举的ID或名称来进行查找定位,以下两句输出内容一样
    println(MyEnum(0))
    println(MyEnum.withName("Red"))
  }
}

Scala对象

时间: 2024-10-15 04:29:47

Scala对象的相关文章

浅谈Scala对象构造过程

我们通过一个例子来体会scala对象的构造过程 首先创建一个车站类: class Station { val size = 100 val spots = new Array[String](size) } 通过size来模拟停车位数,通过字符串数组模拟具体的停车位. 在创建一个停车场类,它是车站的子类 class Park extends Station { override val size = 20 } 停车场没有车站那么多车位,只拥有20个,因此在Park中重写了Station的size

Scala学习(六)---Scala对象

Scala中的对象 摘要: 在本篇中,你将会学到何时使用Scala的object语法结构.在你需要某个类的单个实例时,或者想为其他值或函数找一个可以挂靠的地方时,你就会用到它.本篇的要点包括: 1. 用对象作为单例或存放工具方法 2. 类可以拥有—个同名的伴生对象 3. 对象可以扩展类或特质 4. 对象的apply方法通常用来构造伴生类的新实例 5. 如果不想显式定义main方法,可以用扩展App特质的对象 6. 你可以通过扩展Enumeration对象来实现枚举 单例对象 Scala没有静态方

scala对象简单记录

object Person { private val eyeNum = 2 def getEyeNum = eyeNum def main(args: Array[String]): Unit = { println(Person.getEyeNum) // 2 } } abstract class Hello(var message:String) { def sayHello(name :String) } object HelloImpl extends Hello("hello&quo

Scala 单例对象

环境: CentOS 6.3, eclipse 单例对象:类是指用class定义的scala 对象,如果用object替换class关键字,那么这个就叫单例对象,sigleton object, 单例对象不可以使用new 关键字生成新的对象实例下面使用三种使用校验和的方式来解释大家的疑问. ChecksumAccumulator.scala //定义class(类) ChecksumAccumulator 和其伴生单例对象(object) ChecksumAccumulator package

【转】Scala 中的 Stream

///////////////////////////////////// def numsFrom(n: Int): Stream[Int] = n #:: numsFrom(n + 1) def testStream = { val tenOrMore = numsFrom(10) println(tenOrMore) println(tenOrMore.tail) println(tenOrMore.tail.tail) println(tenOrMore.tail.tail.tail)

scala入门教程:scala中的面向对象定义类,构造函数,继承

我们知道scala中一切皆为对象,函数也是对象,数字也是对象,它是一个比java还要面向对象的语言. 定义scala的简单类 class Point (val x:Int, val y:Int) 上面一行代码就是一个scala类的定义: 首先是关键字class 其后是类名 Point 类名之后的括号中是构造函数的参数列表,这里相当于定义了对象的两个常量,其名称分别为x,y,类型都是Int 上面的类和下面的类是一致的,不过更精简了. class Point (xArg:Int, yArg:Int)

Scala类

要点 类中的字段自动带有getter方法和setter方法 可以用定制的getter/setter方法替换掉字段的定义,而不必修改使用类的客户端----这就是"统一访问原则" 用@BeanProperty注解来生成JavaBeans的getXxx/setXxx方法 每个类都有一个主要的构造器,这个构造器和类定义"交织"在一起.它的参数直接成为类的字段,主构造器执行类体中所有的语句. 辅助构造器是可选的,它们叫做this 在Scala源文件中,可以包含多个类,所有这些

Scala访问修饰符(四)

Scala 访问修饰符基本和Java的一样,分别有:private,protected,public. 如果没有指定访问修饰符符,默认情况下,Scala对象的访问级别都是 public. Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层类甚至不能访问被嵌套类的私有成员. 私有(Private)成员 用private关键字修饰,带有此标记的成员仅在包含了成员定义的类或对象内部可见,同样的规则还适用内部类. class Outer{ class Inner{ pr

Scala:HelloWorld

代码 1 object HelloWorld { 2 def main(args: Array[String]): Unit = { 3 println("Hello world") 4 } 5 } 解说 object关键字相当于static(更确切的说法是单例模式的一种语言层面的支持),def关键字定义方法,方法参数和返回值都采用后缀形式,即:“:类型”,Unit代表void,数组的表示采用Array[T],main是特殊的入口方法. 在控制台执行“scala 对象名”,传入的参数必