【導讀:數據是二十一世紀的石油,蘊含巨大價值,這是·情報通·大數據技術系列第[90]篇文章,歡迎閱讀和收藏】
1 基本概念
類是對象的抽象,而對象是類的具體實例。類是抽象的,不佔用內存,而對象是具體的,佔用存儲空間。類是用於創建對象的藍圖,它是一個定義包括在特定類型的對象中的方法和變量的軟件模板。
2 術語解釋
類是面向對象程序設計( OOP , Object-Oriented Programming )實現信息封裝的基礎。類是一種用戶定義類型,也稱類類型。每個類包含數據說明和一組操作數據或傳遞消息的函數。
對象,類的實例是對象。
繼承是指一個對象直接使用另一對象的屬性和方法。
3 詳細說明
Scala 中的類不聲明為 public ,一個 Scala 類源文件可以有多個類。
<code>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
print("x 的座標點: " +x);
print("y 的座標點: " +y);
}
}
object Test
{
def main(args: Array[String])
{
val pt = new Point(10, 20);
pt.move(10, 10);
}
}/<code>
以上實例的類定義了兩個變量 x 和 y ,一個 move 方法。
Scala 的類定義可以有參數,成為類參數,如上面的 xc , yc ,類參數在整個類中都可以訪問。
可以使用 new 來實例化類,並訪問類中的方法和變量。
執行以上代碼,輸出結果為:
x 的座標點 : 20
y 的座標點 : 30
Scala 繼承
Scala 繼承一個基類跟 Java 很相似,但我們需要注意以下幾點:
1、 重寫一個非抽象方法必須使用 override 修飾符。
2、 只有主構造函數才可以往基類的構造函數里寫參數。
3、 在子類中重寫超類的抽象方法時,不要使用 override 關鍵字。
<code>class Point(val xc: Int, val yc: Int)
{
\tvar x: Int = xc
\tvar y: Int = yc
\tdef move(dx: Int, dy: Int)
\t{
\t\tx = x + dx
\t\ty = y + dy
\t\tprintln ("x 的座標點 : " + x);
\t\tprintln ("y 的座標點 : " + y);
\t}
}
class Location(override val xc: Int, override val yc: Int,
\tval zc :Int) extends Point(xc, yc){
\tvar z: Int = zc
\tdef move(dx: Int, dy: Int, dz: Int)
\t{
\t\tx = x + dx
\t\ty = y + dy
\t\tz = z + dz
\t\tprintln ("x 的座標點 : " + x);
\t\tprintln ("y 的座標點 : " + y);
\t\tprintln ("z 的座標點 : " + z);
\t}
}
object Test
{
\tdef main(args: Array[String])
\t{
\t\tval loc = new Location(10, 20, 15);
\t\tloc.move(10, 10, 5);
\t}
}/<code>
Scala 使用 extends 關鍵字來繼承一個類。實例中 Location 類繼承了 Point 類。 Point 成為父類(基類), Location 稱為子類。
override val xc 為重寫了父類的字段。
繼承會繼承父類的所有屬性和方法, Scala 只允許繼承一個父類。
執行以上代碼,輸出結果為:
x 的座標點 : 20
y 的座標點 : 30
z 的座標點 : 20
Scala 單例對象
在 Scala 中,沒有 static 修飾符,使用 object 關鍵字,提供單例模式的實現方法。
Scala 中使用單例模式時,除了定義的類之外,還要定義一個同名的 object 對象,它和類的區別是, object 對象不帶參數。
當單例對象與某個類共享同一個名稱時,他被稱作是這個類的伴生對象: companion object 。必須在同一個源文件裡定義類和它的伴生對象。類被稱為這個單例對象的伴生類: companion class 。類和它的伴生對象可以互相訪問其私有成員。
伴生對象實例
<code>// 私有構造方法
class Marker private(val color:String)
{
\tprintln(" 創建 " + this)
\toverride def toString(): String = " 顏色標記: "+ color
}
\t// 伴生對象,與類共享名字,可以訪問類的私有屬性和方法
\tobject Marker{
\t\tprivate val markers: Map[String, Marker] = Map(
\t\t"red" -> new Marker("red"),
\t\t"blue" -> new Marker("blue"),
\t\t"green" -> new Marker("green")
\t)
\tdef apply(color:String) =
\t{
\t\tif(markers.contains(color)) markers(color) else null
\t}
\tdef getMarker(color:String) =
\t{
\t\tif(markers.contains(color)) markers(color) else null
\t}
\tdef main(args: Array[String])
\t{
\t\tprintln(Marker("red"))
\t\t// 單例函數調用,省略了 .( 點 ) 符號
\t\tprintln(Marker getMarker "blue")
\t}
}/<code>
執行以上代碼,輸出結果為:
創建顏色標記: red
創建顏色標記: blue
創建顏色標記: green
顏色標記: red
顏色標記: blue
閱讀更多 情報通 的文章