Scala類和對象
本章將介紹如何在Scala編程中使用類和對象。類是對象的藍圖(或叫模板)。定義一個類後,可以使用關鍵字new
來創建一個類的對象。 通過對象可以使用定義的類的所有功能。
下面的圖通過一個包含成員變量(name
和 rollNo
)和成員方法(setName()
和setRollNo()
)的Student
類的例子來演示類和對象。最後都是類的成員。類是一個模板的東西,而對象是真實存在的。 在下圖中,Student
是一個類,而具體學生:Harini, John, 和 Maria 是學生類的對象,這此對象有是名字和註冊號。
類基礎
以下是在Scala
中定義類的簡單語法。這個類定義了兩個變量x
和y
以及一個move
方法,它沒有返回值。
使用類的名稱作爲一個類構造函數,構造函數可以使用多個參數。 上面的代碼定義了兩個構造函數參數xc
和yc
; 它們在類的整個定義中都是可見的。
語法
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
來創建對象,然後訪問類字段和方法,如下例所示:
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中,並使用以下命令編譯和執行此程序。
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
關鍵字,只有主構造函數可以通過參數調用基類構造函數。讓我們擴展上面的類,並增加一個類的方法。
例子
讓我們使用兩個類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);
}
}
將上述程序保存在源文件: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