【scala】类的定义和单例对象
一、类的定义
Scala类的定义跟JAVA中类的定义基本是一样的。
示例
class ChecksumAccumulator{
var sum = 0;//Scala默认关键字为public
private 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.mutable
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 cs = acc.checkSum();
cache += (s -> cs);//将(s,cs)加入cache
cs;//这里省略了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特性的,可以直接拿来用不用new
private var lastId = 0;//这个字段是静态的
private def newLastId() ={
lastId += 1;
lastId;
}
def main(args:Array[String]): Unit ={
val person1 = new Person("zhangyuhang");
//建立Person类,类再调用半生对象的newLastId
val person2 = new Person("zhangqiuyue");
person1.info();
person2.info();
}
}
运行结果
zhangyuhangid is 1
zhangqiuyueid is 2
结果分析,因为定义在object中的字段和方法都是静态的。
newLastId方法定义在object中为静态方法,可以直接调用。
我们在每次调用newLastId方法的时候,因为IastId是静态字段所以都在原有基础上+1.
尽管是不同对象调用的也如此。
【scala】类的定义和单例对象的更多相关文章
- Scala入门1(单例对象和伴生类)
一.Hello World程序的执行原理 参考http://blog.csdn.net/zhangjg_blog/article/details/22760957 object HelloWorld{ ...
- Scala单例对象、伴生对象实战详解
1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...
- Scala单例对象和伴生对象
1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...
- scala学习手记14 - 单例对象
java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...
- 探索Scala(3)-- 单例对象
研究一下Scala语言的单例对象(Singleton Objects),为下一篇文章做准备. static不是keyword 上一篇文章提到过,interface并非Scala语言keyword,能够 ...
- Scala 孤立对象和单例对象方法体的用法和例子
[学习笔记] 1 以object关键字修饰一个类名,这种语法叫做孤立对象,这个对象是单例的. 相当于将单例类和单例对象同时定义.相当于java中的单例,即在内存中只会存在一个Test3实例.创建一个 ...
- 010-Scala单例对象、伴生对象实战详解
010-Scala单例对象.伴生对象实战详解 Scala单例对象详解 函数的最后一行是返回值 子项目 Scala伴生对象代码实战 object对象的私有成员可以直接被class伴生类访问,但是不可以被 ...
- apply 伴生对象 单例对象
apply(): 当类或者对象有一个主要用途时,apply方法提供了很好语法机制 scala> class Foo {} defined class Foo scala> object F ...
- 【Cocos2d-X游戏实战开发】捕鱼达人之单例对象的设计(二)
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为cocos2d-x-2.1.5) 博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...
随机推荐
- django博客项目1.环境搭建
安装 Python Windows 下安装 Python 非常简单,去 Python 官方网站找到 Python 3 的下载地址,根据你的系统选择 32 位或者 64 位的安装包,下载好后双击安装即可 ...
- node.js---sails项目开发(5)---用户表的建立
1. ctrl+c 暂停sails项目 ,输入如下命令,创建一个user表 sails generate api user 2.在api目录分别建立了两个文件 api/controllers/U ...
- 启动一个支持文件上传的HTTP-Server
Python实现,源码来自网络,代码内部有作者信息. HTTP方式共享文件,对于不需要用户名和密码验证的系统非常方便.通过浏览器就可以实现文件上传和下载.非常适合用作测试系统的脚手架. 对于系统使用c ...
- 学点TCPDUMP
[root@future ~]# yum install tcpdump 官网地址: https://nmap.org/ 还有中文手册,太感动了 https://nmap.org/man/zh/man ...
- List集合的ForEach扩展
public static void ForEach<T>(this IEnumerable<T> enumerableSource, Action<T&g ...
- Python 实习遇见的各种面试题
Python 语法 说说你平时 Python 都用哪些库 == 和 is 区别. == 是比较两对象的值,is 是比较在内存中的地址(id), is 相当于 id(objx) == id(objy). ...
- 再来一道测半平面交模板题 Poj1279 Art Gallery
地址:http://poj.org/problem?id=1279 题目: Art Gallery Time Limit: 1000MS Memory Limit: 10000K Total Su ...
- IIS DirectoryEntry
DirectoryEntry是.Net给我们的一大礼物,他的名字我们就知道他的功能--目录入口.使用过ADSI的人都知道操作IIS,WinNT这些时,我们还需要提供他们的Path,操作IIS时,这个P ...
- H5中的语义化标签
H5中的语义化标签也就是之前的id = “header”演变而来的 只不过之前是id 现在变成了标签而已 什么是语义化: 根据内容结构化(内容语义化) 选择合适的标签(代码语义化) 便于开发者阅读和写 ...
- 20145219 《Java程序设计》第16周课程总结
20145219 <Java程序设计>第16周课程总结 每周读书笔记(即学习总结)链接汇总 第0周问卷调查 第1周读书笔记 第2周读书笔记 第3周读书笔记 第4周读书笔记 第5周读书笔记 ...