scala之class、singleton object

类和对象

  • 了解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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值