类和对象
- 了解scala class、field、method,interface
- 了解 singleton object
- 了解怎么去写、运行Scala程序
class、field、method
- Scala默认访问级别是public
- private关键字隐藏field
- method参数都是val类型
默认返回
def checkSum() : Int = {
return ~(sum & 0xFF) + 1
}
等价于
def checkSum() : Int = {
~(sum & 0xFF) + 1
}
- 有返回值时,若没有显式return,则会返回方法体中计算出的最后一个值
- 推荐方式:避免使用显式return、多个return,保持方法足够精简
Singleton Object
scala类中没有static方法
伴随类,伴随对象
Single object和class同名时,两则互为伴随类和伴随对象。
import scala.collection.mutable
//类
class CheckSumAccumulator {
private var sum = 0
def add(b: Byte) : Unit = {
sum += b
}
def checkSum() : Int = {
~(sum & 0xFF) + 1
}
}
//对象
object CheckSumAccumulator {
private val cache = mutable.Map.empty[String, Int]
def calculate(s : String) : Int = {
if (cache.contains(s)) {
cache(s)
} else {
val acc = new CheckSumAccumulator
for (c <- s) {
acc.add(c.toByte)
}
val v = acc.checkSum()
cache += (s -> v)
v
}
}
}
调用: println(CheckSumAccumulator.calculate(“hello world”))
- 伴随类和对象存在时,必须在同一个源文件中定义
- 伴随类和对象可以互相访问对象的私有成员
- singleton object有些类似java中包含static方法的类,区别是singleton object的名字是一个对象的名称标记
- singleton object不是一种类型,不能执行new操作,它是对伴随类的扩展
- 通过类型访问singletong object的方法
- singleton object本质是静态引用,指向一个合成类对象,跟java static成员具有相同的初始化过程
- 通常singleton object初始化发生在第一次被调用时
scala application
运行scala程序
编写程序
- singleton object
- main函数
object ScalaTest {
def test(acc : CheckSumAccumulator) : Int = {
acc.checkSum()
}
def main(args : Array[String]) : Unit = {
println(CheckSumAccumulator.calculate("hello world"))
}
}
- 默认引入java.lang包和scala包的所有成员
- 默认引入singleton object Predef的所有成员
- println、assert都是Predef的成员
- 与java不同的是:scala的源文件名可以和包含的类名不同,但这种方式不推荐
编译
$ scalac CheckSumAccumulator.scala ScalaTest.scala
或者
$ fsc CheckSumAccumulator.scala ScalaTest.scala
- scalac是scala编译器
- 编译时需要将依赖类一起编译,否则找不到类
- fsc (fast scala compiler), 在第一次启动时会创建一个本地服务器,接收待编译的文件,进行编译
- 关闭fsc: fsc -shutdown
scalac: 每次编译时都会先扫描依赖的jar包,做一些初始化工作,比较耗时。
fsc: 仅在第一次编译时会创建本地服务器,等待接收编译请求,后面接收到编译请求后会立即进行编译。
运行
$ scala ScalaTest
app trait
程序
object ScalaAppTest extends App {
for (arg <- args) {
println(CheckSumAccumulator.calculate(arg))
}
}
编译
$ scalac CheckSumAccumulator.scala ScalaAppTest.scala
运行
$ scala ScalaAppTest hello world
-20
-40
- scala.App允许直接把main方法中的方法体写入到{ }内
- 通过args,可以直接访问传入的参数
总结
本节主要简单讲了scala的class的特性、single object、怎么编写编译和运行scala程序及scala App。