Scala之类和对象


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

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

2、分号推断的规则

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

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

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

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

3、Singleton对象

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

packagecom.turing.program.collection
importscala.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.collection
importcom.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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芸复山人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值