scala学习笔记——类和对象

时间:2023-01-25 23:10:21

 

基础语法
关于Scala程序,这是非常要注意以下几点。

区分大小写 - Scala是大小写敏感的,这意味着标识Hello 和 hello在Scala中会有不同的含义。

类名 - 对于所有的类名的第一个字母要大写。

如果需要使用几个单词来构成一个类的名称,每个单词的第一个字母要大写。

示例:class MyFirstScalaClass

方法名称 - 所有的方法名称的第一个字母用小写。

如果若干单词被用于构成方法的名称,则每个单词的第一个字母应大写。

示例:def myMethodName()

程序文件名 - 程序文件的名称应该与对象名称完全匹配。

保存文件时,应该保存它使用的对象名称(记住Scala是区分大小写),并追加“.scala”为文件扩展名。 (如果文件名和对象名称不匹配,程序将无法编译)。

示例: 假设“HelloWorld”是对象的名称。那么该文件应保存为'HelloWorld.scala“

def main(args: Array[String]) - Scala程序从main()方法开始处理,这是每一个Scala程序的强制程序入口部分。

 

类和对象的一些基础知识

import scala.collection.mutable.Map

class ChecksumAccumulator {
  val sum_public = 0 //public 是scala的默认访问级别
  private var sum_private = 0 //类私有的

  def add(b:Byte): Unit = {
    b = 1 //会报错,scala的方法中的参数都是val类型
    sum_private += b
  }

  def add_2(b:Byte){sum_private += b} //与方法add等效

  def add_3(b:Byte):Unit = sum_private += b //与方法add和add_3等效

  /*
  * 方法f和g返回的都是Unit类型
  * 方法h返回的是String类型
  * */
  def f(): Unit =" this String gets lost "
  def g(){ " this String gets lost too"}
  def h() = { " this String gets lost too"}

  def checksum(): Int = {
    /*
    此处的return是多余的,如果没有显示的返回语句,scala方法将返回方法中最后一次计算得到的值
    */
    return ~(sum_private &0xFF) + 1
  }

  def chechsum_2(): Int = ~(sum_private &0xFF) + 1 //与方法checksum等效
}

/*
scala比java更为面向对象的特点之一是scala不能定义静态成员,而是代之以定义单例对象。除了用object关键字替换了class关键字之外,单例对象的定义看上去与类定义一致
单例对象与类名称相同,被称为这个类的伴生对象,类被称为单例对象的伴生类

*/
object ChecksumAccumulator{

  private val cache = Map[String,Int]()

  def calmulate(s:String): Int = {
    if (cache.contains(s))
      cache(s)
    else {
      val acc = new ChecksumAccumulator // acc是ChecksumAccumulator类的一个实例,不是同名的单例对象
      for (c <- s)
        acc.add(c.toByte)
      val cs = acc.checksum()
      cache.+= ((s -> cs))
      cs
    }
  }

  def main(args: Array[String]) {
    val acc = new ChecksumAccumulator
    val csa = new ChecksumAccumulator

    acc.add(100)
    println(acc.checksum())
    ChecksumAccumulator.calmulate("Every value is an object.") //此处调用的是单例对象,像调用java的静态方法工具类一样调用
    println(acc.sum_private)// sum_private是类私有的,不能直接访问,只能类内访问
    acc.sum_public=3 // 会报错,sum_public是val常量,不是var变量
  }
}