1,在Scala中定義類是用class關鍵字;
2,可以使用new ClassName的方式構建出類的對象;
3, 如果名稱相同,則object中的內容都是class的靜態內容,也就是說object中的內容class都可以在沒有實例的時候直接去調用;正是因爲可以在沒有類的實例的時候去調用object中的一切內容,所以可以使用object中的特定方法來創建類的實例,而這個特定方法就是apply方法;
4,object中的apply方式是class對象生成的工廠方法,用於控制對象的生成;
5, 很多框架的代碼一般直接調用抽象類的object的apply方法去生成類的實例對象:
第一:其祕訣在於apply具有類的對象生成的一切生殺大權,抽象類是不可以直接實例化的,在apply方法中可以實例化抽象類的子類,以Spark中的圖計算爲例,Graph是抽象的class,在object Graph中的apply方法實際上是調用了Graph的子類GraphImpl來構建Graph類型的對象實例的,當然從Spark圖計算的源碼可以看出,GraphImpl的構造也是使用了object GraphImpl的apply方法;
第二:這種方式神奇的效應在於更加能夠應對代表版本迭代或者修改的變化,這是更高意義的面向接口編程;
6,object HelloOOP是class HelloOOP的伴生對象,class HelloOOP可以直接訪問object HelloOOP中的一切內容,而class HelloOOP是object HelloOOP的伴生類,object HelloOOP可以直接訪問class HelloOOP的一切內容,一個特例是用private[this]修飾的成員,我們會在後面講解。
7, 在定義Scala的class的時候可以直接在類名後面()里加入類的構造參數,此時在apply方法中也必須有這些參數;
8,scala中可以在object中構造很多apply方法;
9, Scala中的很多集合都是使用apply的方式構造的,例如Array:
def apply[T: ClassTag](xs: T*): Array[T] = {
val array = new Array[T](xs.length)
var i = 0
for (x <- xs.iterator) { array(i) = x; i += 1 }
array
}
=======================================================================================
class HelloOOP(age:Int){
var name="Spark"
def sayHello={
println("Hi,My name is :" + name)
println("I am " + age + " years old")
}
}
object HelloOOP {
var number=0
def main(args: Array[String]): Unit = {
println("Hello Scala OOP!!!")
val helloOOP=HelloOOP()
helloOOP.sayHello
}
def apply(): HelloOOP={
println("My number is :" + number)
number +=1
new HelloOOP(10)
}
def apply(age: Int):HelloOOP={
println("My number is :" + number)
number +=1
new HelloOOP(age)
}
}
Hello Scala OOP!!!
My number is :0
Hi,My name is :Spark
I am 10 years old
本課程筆記來源於: