九、scala面向對象編程之繼承

一、  extendsjava

二、override 和super

三、override fieldide

四、isInstanceOf和asInstanceOf函數

五、getClass和classOfthis

六、使用模式匹配進行類型判斷spa

七、protected

八、調用父類的constructscala

九、匿名內部類3d

十、抽象類對象

十一、抽象fieldblog

一、  extends

  scala中,讓子類繼承父類,與java同樣,也使用extends關鍵字。繼承

  子類能夠從父類繼承父類的field和method,而後子類能夠在本身內部放入父類沒有,子類特有的field和method,使用繼承能夠有效服用代碼。

  子類能夠覆蓋父類的field和method,可是若是父類用final修飾,則該類是沒法被繼承的; 若是父類的field和method用final修飾,則field和method是沒法被覆蓋的。

   

二、override 和super

  若是子類要覆蓋父類的非抽象方法,則必須許使用override關鍵字。

  Override關鍵字能夠幫助咱們今早發現代碼裏的錯誤,好比override修飾的父類方法的方法名拼寫錯了,覆蓋父類方法的參數咱們寫錯了,等等。

  子類覆蓋父類方法後,若是咱們須要調用父類被覆蓋的方法,可使用super關鍵字,顯示的指定要調用的父類的方法

  

三、override field

  Scala中,子類能夠覆蓋父類的val field,並且子類的val field還能夠覆蓋父類的val field的getter方法,只要在子類中使用override便可。

   

四、isInstanceOf和asInstanceOf

  若是建立了子類的對象,但又將其賦予了子類類型的變量,後續在程序中,又須要將父類類型的變量轉換爲子類類型的變量。

  首先,須要使用isInstanceOf判斷對象是不是指定類的對象,若是是的話,則可使用asInstanceOf將對象轉換爲指定類型。

  若是對象是null,則isInstanceOf必定返回false,asInstanceOf必定給返回null。

  若是沒有isInstanceOf先判斷對象是否爲指定類的實例,就直接用asInstanceOf轉換,則可能拋出異常。

  

五、getClass和classOf

  isInstanceOf只能判斷出對象是不是指定類及其子類的對象,而不能精確判斷出,對象就是指定類的對象。

  若是要求精確的判斷對象就是指定類的對象,那麼就只能使用getClass和classOf了。

  對象.getClass能夠精確獲取對象的類,classOf[類]能夠精確獲取類,使用==操做便可判斷。

  

六、使用模式匹配進行類型判斷

  在實際開發中,大量的使用了模式匹配的方式進行類型的判斷,這種方式更加簡潔明瞭,並且代碼可維護性和可擴展性也很是高。

  使用模式匹配,功能性上來講,與isInstanceOf同樣,也是判斷主要是該類以及該類的子類的對象便可,不是精準判斷的。

   

七、protected

  Scala中,可使用protected修飾field和method,這樣在子類中就能夠不須要super關鍵字,直接就能夠訪問field和method。

  可使用protected[this],則只能在當前子類對象中訪問父類的field和method,沒法經過其餘子類對象訪問父類的field和method。

  

八、調用父類的construct

  Scala中,每一個類能夠有一個主constructor和任意多個輔助constructor,而每一個輔助constructor的第一行都必須是調用其它輔助constructor或者是主constructor,所以子類的輔助constructor是必定不能直接調用父類的constructor的。

  只能在子類的主constructor中調用父類的constructor,如下這種語法,就是經過子類的主構造函數來調用父類的構造函數。

  若是是父類中接受的參數,好比name和age,子類中接受時,就不要用任何val或var來修飾了,不然會認爲是子類要覆蓋父類的field。

  

  

九、匿名內部類

  Scala中,匿名子類很是常見,並且很是強大,spark源碼中使用了大量這種匿名內部類。

  匿名子類就是說能夠定義一個類的沒有名稱的子類,並直接建立其對象,而後將對象的引用賦予一個變量,以後甚至能夠將該匿名子類的對象傳遞給其餘函數。

  

十、抽象類

  若是在父類中,某些方法沒法當即實現,而須要依賴不一樣的子類來覆蓋,重寫實現本身不一樣的方法實現。此時能夠將父類中的這些方法不給出具體的實現,只有方法簽名,這種方法就是抽象方法。

  若是一個類中有一個抽象方法,那麼類就必須用abstract來聲明爲抽象類,此時抽象類是不能夠實例化的。

  在子類中覆蓋抽象類的抽象方法時,不須要使用override關鍵字。

  

十一、抽象field

  若是在父類中,定義了fiield,可是沒有給出初始值,則此field爲抽象field。

  抽象field意味着,scala會根據本身的規則,爲var或val類型的field生成對應的getter和setter方法,可是父類中是沒有該field的。

  子類必須覆蓋field,以定義本身的具體field,而且覆蓋抽象field,不須要使用override關鍵字。

  

相關文章
相關標籤/搜索