1. 程式人生 > >[筆記遷移][Spark開發語言][Scala][6]面向物件

[筆記遷移][Spark開發語言][Scala][6]面向物件

一、 類

ClassExample

  1. 方法與函式的定義一樣,需要使用"=",對於“不需要返回”的方法,可以直接省略"="(隱式返回Unit的過程)。

  2. 沒有引數且只有一條語句的方法可以省略引數列表定界()和方法體定界{}。

  3. 定義時沒有括號的無參方法在外部呼叫時也不能加括號。

  4. 域: getter與setter的規則
    (1) 每個欄位必須在定義時指定預設初始化值

    (2) 定義時未使用private修飾的var field,當Scala生成面向JVM的類時,會定義private的欄位及與之對應的public getter/setter

    (3) 如果使用private修飾的var field,則自動生成與之對應的private getter/setter,需要自定義方法獲取/設定該field的值

    (4) 如果定義val field,則只會生成getter

    (5) 自動生成的getter與setter分別叫做FIELDNAME,FIELDNAME_,可以對其進行重寫
    redefineSetter

    (6) 如果不希望自動生成getter/setter,則將field的訪問修飾符宣告為private[this]
    注意:即使定義為private var,同類物件的例項之間還是可以互相訪問其private var。如果不希望被其他同類例項訪問,則需要宣告為private[this] var
    privatethis

    (7) 讓Scala自動生成Java風格的getter/setter,使用@BeanProperty標註欄位,將自動生成四個方法:兩種風格各一對
    AutoSG1

    AutoSG2

  5. 構造器(炒雞特別)
    (1) 主構造器
    [1] Scala主構造器與類名放在一起定義,預設即無參
    [2] Scala類中沒有定義在任何方法或置於任何程式碼塊中的語句都屬於主構造器的定義,這就是為什麼在class域內定義欄位時必須初始化
    mainConstructor
    ※ 如果主構造器定義的引數任何修飾符(var, private var, val, private[this])都沒有,比如name:String,且類內部的方法使用到了,則會自動宣告為private[this] name,否則鏈field都不會自動建立,只能作為主構造器引數列表的佔位符

    [3] 同樣可以在主構造器引數列表中宣告預設值

    (2) 輔助構造器:類似Java構造器過載
    [1] 輔助構造器第一句必須呼叫主構造器或其他輔助構造器
    [2] 以this作為輔助構造器名
    sideConstructor

  6. 內部類:與Java不同,每個外部類例項的內部類都是 “自己獨有” 的類
    InternalClass

二、object

  1. object,全域性singleton物件(單例模式),通常保持共享“非this”的值和方法,類似Java的靜態成員

  2. 第一次訪問object時,才會執行object的構造器(僅一次),即那些位於object域內且不在方法域內的程式碼

  3. object不能定義接收引數的構造器

  4. object繼承抽象類
    ExtendsAbstractClass

  5. object實現列舉
    (1) Scala 沒有直接可用的Enum
    (2) 實現列舉需要extends Enumeration,並且呼叫Value方法來初始化列舉值
    objectEnum
    InitEnum
    EnumOps

三、伴生物件

  1. 如果有一個class,還有一個與class 同名 的object,那麼這個object就是這個class的伴生物件(class是object的伴生類)

  2. 伴生類和伴生物件必須放在同一個.scala原始檔中

  3. 伴生類和伴生物件可以互相訪問private 域

  4. apply()
    (1) 伴生物件中定義的工廠方法,返回伴生類的新物件
    (2)Scala中,通常不會使用new建立物件,而是直接使用 “伴生類名()”,隱式呼叫了伴生物件的apply()的工廠方法,使建立物件更加簡潔

  5. main()
    (1) Scala中的main()標準定義為def main(args : Array[String])
    (2) 除了手動編寫main()之外,還可以extends App,把需要在main()中執行的程式碼直接作為object的“一次構造器”程式碼。而且使用args可以接收控制檯傳入的引數
    objectExtendsApp

四、 繼承

  1. 關鍵字與Java一樣,使用extends
    ExtendsExample1
    ExtendsExample2

  2. override 和 super
    (1) override必須顯式宣告
    (2) Scala中可以override val域及getterOverrideFiledAndGetter

  3. 型別判斷與向下轉型:isInstanceOf與asInstanceOf[]
    (1) 如果引用沒有關聯物件(為null),那麼isInstanceOf一定返回false,asInstanceOf一定會返回null

    (2) 如果沒有用isInstanceOf先判斷物件是否為指定類的例項,就直接用asInstanceOf轉換,則可能會丟擲異常
    InstanceOf

  4. 確切型別:getClass 與 ClassOf
    SpecificClass

  5. 使用模式匹配函式進行匹配(仍然是多型匹配)
    match

  6. protected 與 protected[this]

  7. 父類構造器的呼叫
    (1) 由於Scala類中每個輔助構造器的第一行都必須呼叫主構造器或其他輔助構造器,因此子類的輔助構造器一定不能直接呼叫父類的構造器
    (2) 使用特殊語法 在子類的主構造器中呼叫父類的構造器
    SubClassConstructor

五、匿名內部類

定義形式與Java一致

六、抽象類

定義形式與Java一致
只要注意一點:方法簽名寫全!!!尤其注意返回型別

七、抽象域

  1. 如果在父類中定義了field,但沒有給出初始值,則此field為抽象field
  2. Scala為var/val定義的field生成對應的getter和setter,但在父類中沒有該field
  3. 子類必須覆蓋抽象field,但不需要override關鍵字