1、Public是Scala的默认访问级别
在Scala里把成员公开的方法是不显式的指定任何访问修饰符。换句话说,在Java里要写上“public”的地方,在Scala里只要什么都不要写就成。Public是Scala的默认访问级别。
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特质。