Scala類和對象

類是對象的抽象,而對象是類的具體實(shí)例。類是抽象的,不占用內(nèi)存,而對象是具體的,占用存儲空間。類是用于創(chuàng)建對象的藍(lán)圖,它是一個(gè)定義包括在特定類型的對象中的方法和變量的軟件模板。
我們可以使用 new 關(guān)鍵字來創(chuàng)建類的對象,實(shí)例如下:

  class Point(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 ("x 的坐標(biāo)點(diǎn): " + x); 
                      println ("y 的坐標(biāo)點(diǎn): " + y);
         }
  }

Scala中的類不聲明為public,一個(gè)Scala源文件中可以有多個(gè)類。
以上實(shí)例的類定義了兩個(gè)變量 xy ,一個(gè)方法:move,方法沒有返回值。
Scala 的類定義可以有參數(shù),稱為類參數(shù),如上面的 xc, yc,類參數(shù)在整個(gè)類中都可以訪問。
接著我們可以使用 new 來實(shí)例化類,并訪問類中的方法和變量:

          import java.io._
          class Point(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 ("x 的坐標(biāo)點(diǎn): " + x); 
                    println ("y 的坐標(biāo)點(diǎn): " + y); 
              }
      }

  object Test { 
          def main(args: Array[String]) { 
                  val pt = new Point(10, 20); // 移到一個(gè)新的位置 pt.move(10, 10); 
          }
    }

執(zhí)行以上代碼,輸出結(jié)果為:

  $ scalac Test.scala
  $ scala Test
  x 的坐標(biāo)點(diǎn): 20
  y 的坐標(biāo)點(diǎn): 30

Scala 繼承
Scala繼承一個(gè)基類跟Java很相似, 但我們需要注意一下幾點(diǎn):
1、重寫一個(gè)非抽象方法必須使用override修飾符。
2、只有主構(gòu)造函數(shù)才可以往基類的構(gòu)造函數(shù)里寫參數(shù)。
3、在子類中重寫超類的抽象方法時(shí),你不需要使用override關(guān)鍵字。

接下來讓我們來看個(gè)實(shí)例:

      class Point(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 ("x 的坐標(biāo)點(diǎn): " + x); 
                 println ("y 的坐標(biāo)點(diǎn): " + y); 
        }
    }

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

             def move(dx: Int, dy: Int, dz: Int) {
                     x = x + dx 
                     y = y + dy 
                     z = z + dz 
                     println ("x 的坐標(biāo)點(diǎn) : " + x); 
                     println ("y 的坐標(biāo)點(diǎn) : " + y);
                     println ("z 的坐標(biāo)點(diǎn) : " + z); 
          }
     }

Scala 使用 extends 關(guān)鍵字來繼承一個(gè)類。實(shí)例中 Location 類繼承了 Point 類。Point 稱為父類(基類),Location 稱為子類。
override val xc 為重寫了父類的字段。
繼承會繼承父類的所有屬性和方法,Scala 只允許繼承一個(gè)父類。
實(shí)例如下:

      import java.io._
      class Point(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 ("x 的坐標(biāo)點(diǎn) : " + x); 
                            println ("y 的坐標(biāo)點(diǎn) : " + y); 
            }
      }

      class Location(override val xc: Int, override val yc: Int, val zc :Int) extends Point(xc, yc){ 
                  var z: Int = zc 
                  def move(dx: Int, dy: Int, dz: Int) { 
                        x = x + dx 
                        y = y + dy 
                        z = z + dz 
                        println ("x 的坐標(biāo)點(diǎn) : " + x); 
                        println ("y 的坐標(biāo)點(diǎn) : " + y); 
                        println ("z 的坐標(biāo)點(diǎn) : " + z); 
            }
      }

    object Test { 
              def main(args: Array[String]) { 
                      val loc = new Location(10, 20, 15); // 移到一個(gè)新的位置 loc.move(10, 10, 5);
           }
   }

執(zhí)行以上代碼,輸出結(jié)果為:

  $ scalac Test.scala 
  $ scala Test
  x 的坐標(biāo)點(diǎn) : 20
  y 的坐標(biāo)點(diǎn) : 30
  z 的坐標(biāo)點(diǎn) : 20

Scala重寫一個(gè)非抽象方法,必須用override修飾符。

class Person { 
            var name = ""
             override def toString = getClass.getName + "[name=" + name + "]"
        }

class Employee extends Person { 
              var salary = 0.0 
              override def toString = super.toString + "[salary=" + salary + "]"
     }

object Test extends App { 
            val fred = new Employee
             fred.name = "Fred" 
            fred.salary = 50000 println(fred)
  }

執(zhí)行以上代碼,輸出結(jié)果為:

$ scalac Test.scala 
$scala Test
Employee[name=Fred][salary=50000.0]

Scala 單例對象
在 Scala 中,是沒有 static 這個(gè)東西的,但是它也為我們提供了單例模式的實(shí)現(xiàn)方法,那就是使用關(guān)鍵字 object。
Scala 中使用單例模式時(shí),除了定義的類之外,還要定義一個(gè)同名的 object 對象,它和類的區(qū)別是,object對象不能帶參數(shù)。
當(dāng)單例對象與某個(gè)類共享同一個(gè)名稱時(shí),他被稱作是這個(gè)類的伴生對象:companion object。你必須在同一個(gè)源文件里定義類和它的伴生對象。類被稱為是這個(gè)單例對象的伴生類:companion class。類和它的伴生對象可以互相訪問其私有成員。
單例對象實(shí)例

import java.io._class Point(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 point = new Point(10, 20) 
               printPoint 
              def printPoint{ println ("x 的坐標(biāo)點(diǎn) : " + point.x);
              println ("y 的坐標(biāo)點(diǎn) : " + point.y); 
          } 
      }
  }

執(zhí)行以上代碼,輸出結(jié)果為:

  $ scalac Test.scala 
  $ scala Test
  x 的坐標(biāo)點(diǎn) : 10
  y 的坐標(biāo)點(diǎn) : 20

伴生對象實(shí)例

    class Marker private(val color:String) { 
                  println("創(chuàng)建" + this) 
                  override def toString(): String = "顏色標(biāo)記:"+ color 
         }
  // 伴生對象,與類共享名字,可以訪問類的私有屬性和方法
    object Marker{ 
              private val markers: Map[String, Marker] = Map( 
                        "red" -> new Marker("red"), 
                        "blue" -> new Marker("blue"),
                         "green" -> new Marker("green") ) 
            def apply(color:String) = { 
                        if(markers.contains(color)) markers(color) else null
                   } 
            def getMarker(color:String) = { 
                      if(markers.contains(color)) markers(color) else null 
                  }
          def main(args: Array[String]) {
                     println(Marker("red"))
           // 單例函數(shù)調(diào)用,省略了.(點(diǎn))符號 
                 println(Marker getMarker "blue")
           }
        }

執(zhí)行以上代碼,輸出結(jié)果為:

$ scalac Marker.scala 
$ scala Marker
創(chuàng)建顏色標(biāo)記:red
創(chuàng)建顏色標(biāo)記:blue
創(chuàng)建顏色標(biāo)記:green
顏色標(biāo)記:red
顏色標(biāo)記:blue
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 前面提到Scala比Java更加面向?qū)ο螅@是因?yàn)镾cala不允許類保護(hù)靜態(tài)元素(靜態(tài)變量或靜態(tài)方法)。在Scal...
    MaLiang閱讀 311評論 0 2
  • 有了前面的Scala基礎(chǔ),從本篇開始由淺到易逐步介紹Scala編程的各個(gè)方面,博客不可能做到面面俱到,還是希望你有...
    MaLiang閱讀 232評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 一、回環(huán)檢測的意義 SLAM系統(tǒng)有了前端的視覺里程計(jì),有了后端優(yōu)化,似乎已經(jīng)比較好用了。但事情還是沒有我們想象的那...
    金戈大王閱讀 11,084評論 20 6
  • 任何人可能從頭到尾都沒變,只是多穿了一件衣服,有時(shí)候隱瞞并不是欺騙,只是很單純的一個(gè)想法,一個(gè)無心的舉動(dòng),而誤會就...
    某某蘇閱讀 145評論 0 0