「大數據」(九十)Scala類

【導讀:數據是二十一世紀的石油,蘊含巨大價值,這是·情報通·大數據技術系列第[90]篇文章,歡迎閱讀和收藏】

1 基本概念

類是對象的抽象,而對象是類的具體實例。類是抽象的,不佔用內存,而對象是具體的,佔用存儲空間。類是用於創建對象的藍圖,它是一個定義包括在特定類型的對象中的方法和變量的軟件模板。

2 術語解釋

類是面向對象程序設計( OOP , Object-Oriented Programming )實現信息封裝的基礎。類是一種用戶定義類型,也稱類類型。每個類包含數據說明和一組操作數據或傳遞消息的函數。

對象,類的實例是對象。

繼承是指一個對象直接使用另一對象的屬性和方法。

「大數據」(九十)Scala類

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


分享到:


相關文章: