Scala之类和对象

来源:互联网 发布:存货管理的数据 编辑:程序博客网 时间:2024/06/05 18:51


1、Public是Scala的默认访问级别

        在Scala里把成员公开的方法是不显式的指定任何访问修饰符。换句话说,在Java里要写上“public”的地方,在Scala里只要什么都不要写就成。PublicScala的默认访问级别。

2、分号推断的规则

除非一下情况的一种成立,否则行尾被认为是一个分号:

1.  疑问行由一个不能合法作为语句结尾的字结束,如句点或中缀操作符;

2.  下一行开始于不能作为语句开始的词;

3.  行结束于括号(…)或方框[…]内部,因为这些符号不可能容纳多个语句。

3、Singleton对象

        Scala比Java更为面向对象的特点之一是Scala不能定义静态成员,而是代之以定义单利对象(singleton object)。除了用object关键字替换了class关键字意外,单例对象的定义看上去与类定义一致。

packagecom.turing.program.collectionimportscala.collection.mutable.Map objectChecksumAccumulator {  private val cache = Map[String,Int]()  def calculate(s:String): Int = {    if (cache.contains(s)) {      cache(s)    } else {      val acc = newChecksumAccumulator      for(c <- s)        acc.add(c.toByte)      val cs = acc.checksum()      cache += (s-> cs)      cs    }  }   classChecksumAccumulator{    private var sum = 0    def add(b: Byte):Unit = sum += b    def checksum(): Int= ~(sum & 0xFF) + 1  }}      

         

        当单例对象与某个类共享同一个名称时,它就被称为是这个类的伴生对象(companion object)。类和它的伴生对象必须定义在一个源文件里。类被称为是这个单例对象的伴生类(companion class).类和它的伴生对象可以互相访问其私有成员

         类和单例对象间的差别是,单例对象不带参数,而类可以。因为单例对象不是用new关键字实例化的,所以没机会传递给它实例化参数。每个单例对象都被实现为虚构类(synthetic class)的实例,并指向静态的变量,因此它们与Java静态类有着相同的初始化语义。特别要指出的是,单例对象在第一次被访问的时候才会被初始化

         不与伴生类共享名称的单例对象被称为独立对象(standalone object)。它可以用在很多地方,例如作为相关功能方法的工具类,或者定义Scala应用的入口点。

4、Scala程序

      Scala的每个源文件都隐含了对包java.lang、包scala,以及单例对象Predef的成员引用。包scala中的Predef对象包含了许多有用的方法。例如,Scala源文件中写下println语句,实际调用的是Predef的println(Predef.println转而调用Console.println,完成真正的工作)。写下assert,实际是在调用Predef.assert。

5、Application特质

     

    packagecom.turing.program.collectionimportcom.turing.program.collection.ChecksumAccumulator.calculate objectFallWinterSpringSummer extends App{  for(season <- List("fall", "winter", "spring")) {    println(season + ": " + calculate(season))  }}

        使用“extends App”,代之以main方法,可以把想要执行的代码直接放在单例对象的花括号之间。如此而已,之后可以正常的编译和运行。

能这么做,是因为特质Application声明了带有合适签名的main方法,并被单例对象继承,使它可以像Scala程序那样。花括号之间的代码被收集进了单例对象的主构造器(primaryconstructor),并在类被初始化时执行。

        继承自Application比编写完整的main方法要方便,不过也有缺点。首先,如果想访问命令行参数的话就不能用它,因为args数组不可访问。比如,因为Summer程序使用了命令行参数,所以它必须编写完整的main方法。第二,因为某些JVM线程模型里的局限,如对于多线程的程序需要自行编写main方法;最后,某些JVM的实现没有优化被Application特质执行的对象的初始化代码。因此只有当程序相对简单并且是单线程的情况下才可以继承Application特质

1 0