类和对象2:
前面提到,Scala是面向对象的编程,且Scala不允许保护静态元素-静态方法和静态变量。意思是社么呢,就是我虽然使用Private 定义了变量,在外面我还是可以访问。
package org.wq.learn
object CheckSumAccumulator {
def main(args:Array[String]):Unit={
val c = new CheckSumAccumulator()
c.add(2)
c.add(1)
//可以访问私有变量
println(c.sum)
}
}
class CheckSumAccumulator {
private var sum=0;
def add(b:Byte):Unit = sum += b
def add2(b:Byte)=sum+b
def checkSum():Int = ~(sum&0xff)+1
//错误
/*def add2(b:Byte):Unit={
b=b+2
}*/
}
如果想要实现,java的单列模式,Scala中定义了Singleton,使用object定义,它和类定义非常相似,只是用了关键字object。可以把Singleton对象看出java中定义静态成员的地方。且把这个对象是同名对象的伴侣对象,需要放在同一个文件,且对象和其伴侣对象可以互相访问对方的私有成员。
package org.wq.learn
object CheckSumAccumulator {
def main(args:Array[String]):Unit={
val c = new CheckSumAccumulator()
c.add(2)
c.add(1)
//可以访问私有变量
println(CheckSumAccumulator.calculate("hello!word"))
println(CheckSumAccumulator.cache)
}
//定义一个map缓存值,如过里面有s,那么直接放回s对于的值,没有的话,就存份进去
private var cache =Map[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)
cs
}
}
}
class CheckSumAccumulator {
private var sum=0;
def add(b:Byte):Unit = sum += b
def add2(b:Byte)=sum+b
def checkSum():Int = ~(sum&0xff)+1
//错误
/*def add2(b:Byte):Unit={
b=b+2
}*/
}
Scala中的Singleton对象不仅仅作为静态对象的容器,在Scala中也是头等公民,如果仅仅定一个Singleton不会创建一个新的类,你不可以使用new定义类。如下面,会提示你,新建一个类。类定义,以后讲。
今天最后在提一下Scala中的Trait,他和java中的接口很想,但是Scala中的Trait可以实现方法。和C++中的抽象类相似,但是c++中的抽象类不允许集成多个抽象类。Scala中的Trati支持类和singleton和多个Trait混合(可以使用来自多个trait的方法)使用。
package org.wq.learn
object HelloWord extends App{
println("hellword");
}
上面的代码是,Scala为Singleton对象的main方法定义了一个Trait,只要继承这个Trait就可以不用显示的写main,也可以运行,这个Trait,是App。
列子有些是领路蜂上的……感谢~~下篇是Scala的基础类型的……