類是對象的藍圖(或叫模板)。定義一個類後,可使用關鍵字new
來建立一個類的對象。 經過對象可使用定義的類的全部功能。java
下面的圖經過一個包含成員變量(name
和 rollNo
)和成員方法(setName()
和setRollNo()
)的Student
類的例子來演示類和對象。類是一個模板的東西,而對象是真實存在的。 在下圖中,Student
是一個類,而具體學生:Harini, John, 和 Maria 是學生類的對象,對象有名字和註冊號。shell
如下是在Scala
中定義類的簡單語法。ide
這個類定義了兩個變量x
和y
以及一個move
方法,它沒有返回值。函數
使用類的名稱做爲一個類構造函數,構造函數可使用多個參數。 下面的代碼定義了兩個構造函數參數xc
和yc
; 它們在類的整個定義中都是可見的。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()
包含一個循環事務,它將按給定的次數執行語句。假設要執行4
次println("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