一类的定义
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 静态成员是一致的
体现在单例对象在有代码首次访问时才能被初始化
来源: http://www.bubuko.com/infodetail-2542068.html