一、类的定义

  Scala类的定义跟JAVA中类的定义基本是一样的。

示例

class ChecksumAccumulator{var sum = 0;//Scala默认关键字为publicprivate var sum = 0;def add(b : Byte) : Unit ={sum+=b;}     def checkSum() : Int = {return ~(sum & 0xFF) + 1;}
}

  Scala中,当一个方法只会计算一个返回结果的表达式时,可以不用写花括号。

  Scala中,在没有任何显式的return语句时,返回的是该方法计算出的最后一个表达式的值。

  所以上述代码可以简化成

class ChecksumAccumulator{private var sum = 0;def add(b:Byte) = sum+=b;def checkSum() = ~(sum & 0xFF) +1;
}

二、单例对象

  Scala比Java更面向对象的一点,是Scala的类不允许有静态(static)成员。

  对此类使用场景,Scala提供了单例对象。

  我们可以把单例对象当作java的静态方法。但是,单例对象并不仅仅是用来存放静态方法,它是一等对象,可以想象成附加在对象身上的名字标签。

  我们调用单例对象的方法同调用java静态方法是一样的,单例对象名.方法名

  表面上 看上去单例对象的定义跟类的定义很像,只不过是class关键字换成了object关键字。

import scala.colletion.mutableobject 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 cs = acc.checkSum();cache += (s -> cs);//将(s,cs)加入cachecs;//这里省略了return
           }  }

  上面代码是一个单例对象,我们注意到这个单例对象的名字跟上面类的名字相同 ,这样的单例对象成为这个类的伴生对象,反过来,这个类被成为这个对象的半生类。

  伴生类和伴生对象必须同在一个源码文件中,他们可以相互访问对方的私有成员。

  没有同名的伴生类的单利对象成为孤立对象。

  孤立对象有很多用途,例如将工具方法归集在一起,定义Scala应用程序的入口等。

三、类和单例对象的区别

  单例对象不接受参数,而类可以。

  由于没法用new实例化单例对象,也就没有任何手段来向它传参。

  每个单例对象都是通过一个静态变量引用合成类的实例来实现的,因此单例对象从初始花的语义上跟java静态成员是一致的。

  体现在单例对象在有代码首次访问时才能被初始化。

示例

class Person{//类和伴生对象可以相互访问彼此的私有属性private var id = Person.newLastId(); //调用了伴生对象的私有方法private var name = "";def this(name:String){this();this.name = name;}def info(): Unit ={println(name+"id is "+"id");}
}
object Person{//scala对象相当于java中的static类//定义在对象中的字段或者方法也是具有static特性的,可以直接拿来用不用newprivate var lastId = 0;//这个字段是静态的private def newLastId() ={lastId += 1;lastId;}def main(args:Array[String]): Unit ={val person1 = new Person("zhangyuhang");//建立Person类,类再调用半生对象的newLastIdval person2 = new Person("zhangqiuyue");person1.info();person2.info();}
}  运行结果 zhangyuhangid is 1

zhangqiuyueid is 2

 结果分析,因为定义在object中的字段和方法都是静态的。

 newLastId方法定义在object中为静态方法,可以直接调用。

我们在每次调用newLastId方法的时候,因为IastId是静态字段所以都在原有基础上+1.

 尽管是不同对象调用的也如此。

转载于:https://www.cnblogs.com/zzhangyuhang/p/8666152.html

【scala】类的定义和单例对象相关推荐

  1. Scala类的定义,主/辅构造器,以及方法中的变量定义,单例对象,伴生对象,Apply方法调用,应用程序对象

    1. 类 1.1. 类的定义 package cn.toto.scala.day2/*** 在Scala中,类并不用声明为public类型的.* Scala源文件中可以包含多个类,所有这些类都具有共有 ...

  2. 2021年大数据常用语言Scala(二十九):scala面向对象 单例对象

    目录 单例对象 定义object - 掌握 伴生对象 - 掌握 apply方法 - 掌握 main方法 单例对象 Scala中没有static关键字,但是它支持静态 如果要定义静态的东西,统统定义到o ...

  3. Scala单例对象(伴生对象)

    概念 Scala语言是完全面向对象的语言,所以并没有静态的操作(即在Scala中没有静态的概 念).但是为了能够和Java语言交互(因为Java中有静态概念),就产生了一种特殊的对象 来模拟类对象,该 ...

  4. scala什么是单例对象_Scala单例和伴侣对象

    scala什么是单例对象 Scala中的单例对象 (Singleton objects in Scala) Scala being an object-oriented programming lan ...

  5. 静态工具类使用单例对象线程安全问题注意1

    1.记录问题 1.1工具类代码 public static SimpleDateFormat sdfTest = new SimpleDateFormat("yyyy年MM月dd日" ...

  6. 【Kotlin】Kotlin 单例 ( 懒汉式 与 恶汉式 | Java 单例 | Kotlin 单例 | 对象声明 | 伴生对象 | get 方法 | ? 与 !! 判空 )

    文章目录 I . 单例的懒汉式与恶汉式 II . Java 中的懒汉式与恶汉式 III . Kotlin 中对应 Java 的懒汉式与恶汉式 IV . Kotlin 对象 ( object ) 声明 ...

  7. 【cocos2d-js官方文档】二十五、Cocos2d-JS v3.0中的单例对象

    为何将单例模式移除 在Cocos2d-JS v3.0之前.全部API差点儿都是从Cocos2d-x中移植过来的,这是Cocos2d生态圈统一性的重要一环.可惜的是,这样的统一性也在非常大程度上限制了C ...

  8. 单例对象会被jvm的gc时回收吗_【PHP设计模式】单例模式

    前言 设计模式是我们开发过程中的重中之重,所以今天小编就来学习设计模式中的单例模式. 单例模式 <?phpclass Singleton { /*** 定义一个静态变量保存已经实例化的对象* * ...

  9. Kotlin入门(18)利用单例对象获取时间

    前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素.求数组的最大元素等等.那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间.获取 ...

最新文章

  1. ios开发时,在Xcode中添加多个targets进行版本控制
  2. JavaWeb(七)——Cookie、Session
  3. Caffe RPN:把RPN网络layer添加到caffe基础结构中
  4. 3d翻转 ios_iOS自定义转场详解04——实现3D翻转效果
  5. 个人对于MySQL的理解_面试官:谈谈你对Mysql的MVCC的理解?
  6. 使⽤用 Spring Boot Actuator 监控应⽤
  7. 用汇编的眼光看C++(之缺省模板、特化模板)
  8. DDC——Deep Domain Confusion Maximizing for Domain Invariance
  9. Emacs下使用Stardict
  10. html-mp3格式转换器,mp3格式转换器
  11. 关于casewhen...的用法
  12. 学习笔记:GAMES101图形学入门闫令琪(五)抗锯齿
  13. 易语言鼠标移动到桌面计算机图标上,易语言桌面图标提示源码
  14. 蒙特卡洛树搜索 Monte Carlo Tree Search
  15. 【linux 学习】在Linux中经常用到的cmake、make、make install等命令解析
  16. UML画图总结以及浅谈UNL九种图
  17. Android应用权限大全(Manifest.permission)
  18. dgiot百亿级物流标签轨迹时序数据压测
  19. 应届生就业高峰期,Java程序员面试常犯的5点错误总结
  20. 西门子1500数据块移动POKE_BLK指令

热门文章

  1. jQuery.extend 函数详解
  2. shell脚本参数$10问题
  3. 把项目从VS2005升级到VS2013
  4. important的扯淡
  5. NotePad++ 相关插件
  6. 初入angular4——实际项目搭建总结
  7. iOS 常用的几个第三方库
  8. 从零开始学C++之动态创建对象
  9. F5提高Microsoft SharePoint 2010平台的灵捷 度、性能和安全性
  10. Android开发之适配器模式初探