Scala_(2)_面向對象

1.類
class HiScala{
private var name="Spark"
def sayName(){...}
def getName = name
}
創建實例:new HiScala

暴露get 方法的兩種方式:
class HiScala{
private var myName = "flink"
def name = this.myName
def name_=(newName : String){
myName = newName
}
}
class HiScala{
private var myName = "flink"
def name = this.myName
def update(newName : String){
myName = newName
}
}
private[this] 類私有的基礎上,類中的屬性、方法及其對象的私有
class Person{
private[this] var name = "Flink"
def update(newName:String){
...
}
def talk(p : Person){
p.name // 此時不能訪問
}
}

構造器
class Person{
var name = "flink"
var age = 0
def xxx(){
...
}
}
def this(name : String){
this()
this.name = name
}

def this(name:String,age :Int){
this(name)
this.age = age
}
注:與類名在一起定義的就是默認構造器,如SparkContext:
class SparkContext(config : SparkConf)
只要不是定義在方法中,在創建構造器的時候都會執行,常用於成員的初始化
內部類
scala中的內部類與Java中的內部類不同,在Scala中,同一個內部類的不同實例屬於不同的類型

2.Object
類的伴生對象,包含靜態成員和靜態方法
只在第一次調用時執行
object Person{
print("scala")
var salary = 0.0
def getSalary = salary
}
第一次運行Person.getSalary的結果:
scala
0.0
第二次運行Person.getSalary的結果:
0.0
注:伴生類和伴生對象必須定義在同一個文件中

Apply方法
當前類對象的工廠方法,在構造類時,一般是定義在類的伴生對象的Apply方法中
main方法在伴生對象中,因爲在伴生對象中所有的成員都是靜態的

3.抽象類
abstract class
子類的繼承:extends
如果需要複寫父類的方法,需要在方法定義前加上override,如:
override def xxx()
抽象的屬性,在子類中必須複寫這個屬性,最佳實踐:加上override關鍵字
4.Trait
類似接口
可以定義抽象方法,每一具體的實現
類可以使用extends繼承trait,多繼承時需要使用with,如:
abstract claa RDD extends Serializable with Logging

源碼:RDD與SparkContext
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章