scala學習-基本語法4
阿新 • • 發佈:2019-02-19
類和物件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的基礎型別的……