Scala之類和對象

類是對象的藍圖(或叫模板)。定義一個類後,可使用關鍵字new來建立一個類的對象。 經過對象可使用定義的類的全部功能。java

下面的圖經過一個包含成員變量(name 和 rollNo)和成員方法(setName()setRollNo())的Student類的例子來演示類和對象。類是一個模板的東西,而對象是真實存在的。 在下圖中,Student是一個類,而具體學生:HariniJohn, 和 Maria 是學生類的對象,對象有名字和註冊號。shell

一、類基礎

如下是在Scala中定義類的簡單語法。ide

這個類定義了兩個變量xy以及一個move方法,它沒有返回值。函數

使用類的名稱做爲一個類構造函數,構造函數可使用多個參數。 下面的代碼定義了兩個構造函數參數xcyc; 它們在類的整個定義中都是可見的。oop

語法ui

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 ("Point x location : " + x); println ("Point y location : " + y); } }

可使用關鍵字new來建立對象,而後訪問類字段和方法,以下例所示:spa

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 ("Point x location : " + x); println ("Point y location : " + y); } } object Demo { def main(args: Array[String]) { val pt = new Point(10, 20); // Move to a new location pt.move(10, 10); } }

將上述程序保存在Demo.scala中,並使用如下命令編譯和執行此程序。scala

D:\software\scala-2.12.3\bin>scalac Demo.scala

D:\software\scala-2.12.3\bin>scala Demo
Point x location : 20
Point y location : 30

D:\software\scala-2.12.3\bin>

二、擴展類

在Scala中,咱們能夠擴展一個Scala類,使用與Java中相同的方式設計繼承的類(使用extends關鍵字),但有兩個限制:方法重寫須要override關鍵字,只有主構造函數能夠經過參數調用基類構造函數。讓咱們擴展上面的類,並增長一個類的方法。設計

例子code

讓咱們使用兩個類Point做爲一個例子(與上面同樣)和Location類,Location類是一個使用extends關鍵字建立的繼承類。 這樣的「擴展」子句有兩個效果:它使得Location類從Point類繼承全部非私有成員,而且使類型Location成爲Point類類型的子類型。 因此Point類被稱爲超類(父類),Location類被稱爲子類。擴展一個類並繼承父類的全部功能稱爲繼承,但Scala容許只從一個類繼承(不支持多繼承)。

注意 - 在Point類中的move()方法和Location類中的move()方法不會覆蓋move的相應定義,由於它們是不一樣的定義(例如,前者採用兩個參數,後者採用三個參數)。

參考如下示例程序來實現繼承 -

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 ("Point x location : " + x); println ("Point y location : " + 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 ("Point x location : " + x); println ("Point y location : " + y); println ("Point z location : " + z); } } object Demo { def main(args: Array[String]) { val loc = new Location(10, 20, 15); // Move to a new location loc.move(10, 10, 5);
   
loc.move(10, 10);
} }

將上述程序保存在源文件:Demo.scala中,並使用如下命令編譯和執行此程序

D:\software\scala-2.12.3\bin>scalac Demo.scala

D:\software\scala-2.12.3\bin>scala Demo
Point x location : 20
Point y location : 30
Point z location : 20

D:\software\scala-2.12.3\bin>

三、隱性類

當類在範圍內時,隱式類容許與類的主構造函數進行隱式對話。隱式類是一個標有'implicit'關鍵字的類。此功能在Scala 2.10中引入。

語法 - 如下是隱式類的語法。這裏,隱式類始終位於對象範圍內,全部方法定義都被容許,由於隱式類不能是頂級類。

語法

object <object name> { implicit class <class name>(<Variable>: Data type) { def <method>(): Unit = } }

例子

下面演示如何使用隱式類,建立一個名稱爲IntTimes的隱式類,並定義一個times()方法。times()包含一個循環事務,它將按給定的次數執行語句。假設要執行4println("Hello")語句。

如下是示例程序代碼。在這個例子中,使用了兩個對象類(Run 和 Demo),將這兩個類保存在不一樣的文件中,名稱以下

Run.scala - 將如下程序保存在源文件:Run.scala 中

object Run { implicit class IntTimes(x: Int) { def times [A](f: =>A): Unit = { def loop(current: Int): Unit = if(current > 0){ f loop(current - 1) } loop(x) } } }

Demo.scala - 將如下程序保存在源文件:Demo.scala 中 -

import Run._ object Demo { def main(args: Array[String]) { 4 times println("hello") } }

用於如下命令編譯和執行這兩個程序,輸出結果以下

D:\software\scala-2.12.3\bin>scalac Demo.scala

D:\software\scala-2.12.3\bin>scala Demo
hello
hello
hello
hello

D:\software\scala-2.12.3\bin>

注 

  • 隱式類必須在另外一個類/對象/特徵中定義(不在頂層)。
  • 隱式類在其構造函數中只能使用一個非默認參數。
  • 隱式類做用域中不能夠具備與隱式類相同名稱的的任何方法,成員或對象。

四、單例對象

Scala比Java更面向對象,由於在Scala中不能擁有靜態成員,Scala它使用單例對象。單例是一種只能有一個實例的對象。使用object關鍵字對象而不是類關鍵字建立單例。因爲沒法實例化單例對象,所以沒法將參數傳遞給主構造函數。下面列出Scala使用單例對象的全部示例。

如下是實現單例的示例程序 -

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 Demo { def main(args: Array[String]) { val point = new Point(10, 20) printPoint def printPoint{ println ("Point x location : " + point.x); println ("Point y location : " + point.y); } } }

將上述程序保存在源文件:Demo.scala 中,使用如下命令編譯和執行此程序,輸出結果以下

D:\software\scala-2.12.3\bin>scalac Demo.scala

D:\software\scala-2.12.3\bin>scala Demo
Point x location : 10
Point y location : 20
相關文章
相關標籤/搜索