位置:首頁 > 高級語言 > Scala教學 > Scala類與對象

Scala類與對象

類是一個對象的藍圖。一旦定義一個類可以創建從類藍圖使用關鍵字new創建對象。下麵是一個簡單的語法在Scala中定義一個類:

class Yiibai(xc: Int, yc: Int) {
   var x: Int = xc
   var y: Int = yc

   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("Yiibai x location : " + x);
      println ("Yiibai y location : " + y);
   }
}

這個類定義了兩個變量x和y和方法:move,冇有返回值。類變量被調用,類的字段和方法被稱為類方法。

類名可以作為一個類的構造函數,可以采取一些參數。上麵的代碼定義了兩個構造函數的參數:xc和yc;它們都在類的主體內可見。

正如前麵提到的,可以使用關鍵字new創建對象,然後可以按照下麵的例子所示訪問類的字段和方法:

import java.io._

class Yiibai(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("Yiibai x location : " + x);
      println ("Yiibai y location : " + y);
   }
}

object Test {
   def main(args: Array[String]) {
      val pt = new Yiibai(10, 20);

      // Move to a new location
      pt.move(10, 10);
   }
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
Yiibai x location : 20
Yiibai y location : 30

C:/>

擴展一個類:

可以擴展scala類以類似的方式,如在Java中的一樣,但有兩個限製:方法重載需要override關鍵字,隻有主構造可以傳遞參數給基構造。現在擴展上麵的類,並增加一個類的方法:

class Yiibai(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("Yiibai x location : " + x);
      println ("Yiibai y location : " + y);
   }
}

class Location(override val xc: Int, override val yc: Int,
   val zc :Int) extends Yiibai(xc, yc){
   var z: Int = zc

   def move(dx: Int, dy: Int, dz: Int) {
      x = x + dx
      y = y + dy
      z = z + dz
      println ("Yiibai x location : " + x);
      println ("Yiibai y location : " + y);
      println ("Yiibai z location : " + z);
   }
}

extends子句有兩種作用:它使類Location繼承類Yiibai所有非私有成員,它使Location類作為Yiibai類的子類。 因此,這裡的Yiibai類稱為超類,而Location類被稱為子類。擴展一個類,繼承父類的所有功能,被稱為繼承,但scala允許繼承,隻能從一個唯一的類。讓我們看看完整的例子,顯示繼承的用法:

import java.io._

class Yiibai(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
      println ("Yiibai x location : " + x);
      println ("Yiibai y location : " + y);
   }
}

class Location(override val xc: Int, override val yc: Int,
   val zc :Int) extends Yiibai(xc, yc){
   var z: Int = zc

   def move(dx: Int, dy: Int, dz: Int) {
      x = x + dx
      y = y + dy
      z = z + dz
      println ("Yiibai x location : " + x);
      println ("Yiibai y location : " + y);
      println ("Yiibai z location : " + z);
   }
}

object Test {
   def main(args: Array[String]) {
      val loc = new Location(10, 20, 15);

      // Move to a new location
      loc.move(10, 10, 5);
   }
}

需要注意的是方法move,不會覆蓋 move 方法相應的定義,因為它們是不同的定義(例如,前兩個參數,而後者則需要三個參數)。
讓我們編譯和運行上麵的程序,這將產生以下結果:

C:/>scalac Test.scala
C:/>scala Test
Yiibai x location : 20
Yiibai y location : 30
Yiibai z location : 20

C:/>

單例對象:

Scala比Java更麵向對象,因為在Scala中不能有靜態成員。相反,Scala有單例的對象。單例就是隻能有一個實例,即,類的對象。可以使用關鍵字object代替class關鍵字,而不是創建單例。因為不能實例化一個單獨的對象,不能將參數傳遞給主構造。前麵已經看到全部采用單一對象,調用Scala的main方法的例子。以下是單例顯示的相同的例子:

import java.io._

class Yiibai(val xc: Int, val yc: Int) {
   var x: Int = xc
   var y: Int = yc
   def move(dx: Int, dy: Int) {
      x = x + dx
      y = y + dy
   }
}

object Test {
   def main(args: Array[String]) {
      val yiibai = new Yiibai(10, 20)
      printYiibai

      def printYiibai{
         println ("Yiibai x location : " + yiibai.x);
         println ("Yiibai y location : " + yiibai.y);
      }
   }
}

當上述代碼被編譯和執行時,它產生了以下結果:

C:/>scalac Test.scala
C:/>scala Test
Yiibai x location : 10
Yiibai y location : 20

C:/>