1. 程式人生 > >scala學習-基本語法4

scala學習-基本語法4

類和物件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的基礎型別的……