scala之class、singleton object

来源:互联网 发布:如何提升淘宝转化率 编辑:程序博客网 时间:2024/06/05 11:03

类和对象

  • 了解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程序

编写程序

  1. singleton object
  2. 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

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。

原创粉丝点击