一、类的定义

  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】类的定义和单例对象的更多相关文章

  1. Scala入门1(单例对象和伴生类)

    一.Hello World程序的执行原理 参考http://blog.csdn.net/zhangjg_blog/article/details/22760957 object HelloWorld{ ...

  2. Scala单例对象、伴生对象实战详解

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

  3. Scala单例对象和伴生对象

    1.Scala单例对象 Scala单例对象是十分重要的,没有像在Java一样,有静态类.静态成员.静态方法,但是Scala提供了object对象,这个object对象类似于Java的静态类,它的成员. ...

  4. scala学习手记14 - 单例对象

    java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...

  5. 探索Scala(3)-- 单例对象

    研究一下Scala语言的单例对象(Singleton Objects),为下一篇文章做准备. static不是keyword 上一篇文章提到过,interface并非Scala语言keyword,能够 ...

  6. Scala 孤立对象和单例对象方法体的用法和例子

    [学习笔记] 1  以object关键字修饰一个类名,这种语法叫做孤立对象,这个对象是单例的. 相当于将单例类和单例对象同时定义.相当于java中的单例,即在内存中只会存在一个Test3实例.创建一个 ...

  7. 010-Scala单例对象、伴生对象实战详解

    010-Scala单例对象.伴生对象实战详解 Scala单例对象详解 函数的最后一行是返回值 子项目 Scala伴生对象代码实战 object对象的私有成员可以直接被class伴生类访问,但是不可以被 ...

  8. apply 伴生对象 单例对象

    apply(): 当类或者对象有一个主要用途时,apply方法提供了很好语法机制 scala> class Foo {} defined class Foo scala> object F ...

  9. 【Cocos2d-X游戏实战开发】捕鱼达人之单例对象的设计(二)

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为cocos2d-x-2.1.5)    博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...

随机推荐

  1. django_forms组件用ajax发送数据验证注册

    forms组件 -forms是什么? 就是一个类,可以校验字段(前台传过来的字段) -怎么用: -校验字段功能: -先写一个类,继承Form from django.shortcuts import ...

  2. blogCMS整理

    一.在urls中写路由 二.返回登录页面(login.html中写前端代码) - username(用户名) - password(密码) - validCode(验证码) -submit(提交按钮) ...

  3. HTML初识(Day46)

    一.HTML初识 1.web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM ...

  4. Linux基础——系统监控

    系统监视和进程控制工具——top(任务管理器) top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 各行数据大致解释如下: 12: ...

  5. WinIo简介

    WinIo简介 一日发现SendInput对某程序居然无效,无奈只好开始研究WinIo.上网查了很多资料,发现关于WinIo模拟鼠标键盘的资料很少,有的也只是支言片语讲的不是很详细,而且大部分都是关于 ...

  6. LeetCode:全排列II【47】

    LeetCode:全排列II[47] 参考自天码营题解:https://www.tianmaying.com/tutorial/LC47 题目描述 给定一个可包含重复数字的序列,返回所有不重复的全排列 ...

  7. HDU 6319 Ascending Rating (单调双端队列)

    题意:给定一个序列a[1..n],对于每个长度为m的连续子区间,求出区间的最大值和从左往右扫描该区间最大值的变化次数. 分析:先O(n)处理出整个序列的值.求出每个长度为m的连续区间中的最大值可以用单 ...

  8. maven项目中如何创建web.xml

    在web工程创建时创建web.xml:用Eclipse新建一个web项目没有自动生成web.xml 在创建maven工程时,大多没有创建web.xml文件,web.xml路径:src/main/web ...

  9. E-R图和数据库的设计

    数据库设计: 原则:如果属性有了多个字段,可以当实体.如果只有一个字段,只能当属性(比如实体属性种类) 1.设计E-R图 实体:矩形 关系:菱形 属性:椭圆(可省) 2.关系的类型 一对一 一对多 多 ...

  10. django---ORM之Q查询

    filter 等方法中的关键字参数查询都是一起进行“AND” 的. 如果你需要执行更复杂的查询(例如OR 语句),你可以使用Q对象 调用Q from django.db.models import Q ...