1. 程式人生 > >Scala實戰高手****第7課:零基礎實戰Scala面向物件程式設計及Spark原始碼解析

Scala實戰高手****第7課:零基礎實戰Scala面向物件程式設計及Spark原始碼解析

/**
 * 如果有這些語法的支援,我們說這門語言是支援面向物件的語言
 * 其實真正面向物件的精髓是不是封裝、繼承、多型呢?
 * --->肯定不是,封裝、繼承、多型,只不過是支撐面向物件的
 * 一些語言級別的語法和功能,真正的面向物件其實有三個核心特徵:
 * 第一:物件不用關心訊息從哪裡來,也不關心訊息到哪去,只關心訊息處理本身
 * ,也就是說面向物件是弱耦合的且物件是訊息驅動的,或者說物件是資料驅動的
 * 第二:一個物件的行為不影響另一個物件的行為,一個物件掛掉了另一個物件
 * 不會隨著它一起掛掉
 * 第三:面向介面程式設計,為了封裝具體實現的不同和業務的變化
 * 那麼從這個角度講,Java語言和Scala語言都不是面向物件的語言,Java和Scala
 * 都是"支援"面向物件的語言,它用他的封裝、繼承、多型來支援面向物件的三大核心特徵
 * 或者說功能
 * 
 * 函式:不依賴於類的
 * 
 * 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 C7是class C7的伴生物件,class C7可以直接訪問
 * object C7中的一切內容,而class C7是object C7的伴生類
 * ,object C7可以直接訪問class C7的一切內容,一個特例是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
 *   }
 * 
 */ 
---------------------
作者:張涵鈞
來源:CSDN
原文:https://blog.csdn.net/shunhack/article/details/52587834
版權宣告:本文為博主原創文章,轉載請附上博文連結!