一、 extendsjava
三、override fieldide
四、isInstanceOf和asInstanceOf函數
五、getClass和classOfthis
六、使用模式匹配進行類型判斷spa
八、調用父類的constructscala
九、匿名內部類3d
十、抽象類對象
十一、抽象fieldblog
scala中,讓子類繼承父類,與java同樣,也使用extends關鍵字。繼承
子類能夠從父類繼承父類的field和method,而後子類能夠在本身內部放入父類沒有,子類特有的field和method,使用繼承能夠有效服用代碼。
子類能夠覆蓋父類的field和method,可是若是父類用final修飾,則該類是沒法被繼承的; 若是父類的field和method用final修飾,則field和method是沒法被覆蓋的。
若是子類要覆蓋父類的非抽象方法,則必須許使用override關鍵字。
Override關鍵字能夠幫助咱們今早發現代碼裏的錯誤,好比override修飾的父類方法的方法名拼寫錯了,覆蓋父類方法的參數咱們寫錯了,等等。
子類覆蓋父類方法後,若是咱們須要調用父類被覆蓋的方法,可使用super關鍵字,顯示的指定要調用的父類的方法
Scala中,子類能夠覆蓋父類的val field,並且子類的val field還能夠覆蓋父類的val field的getter方法,只要在子類中使用override便可。
若是建立了子類的對象,但又將其賦予了子類類型的變量,後續在程序中,又須要將父類類型的變量轉換爲子類類型的變量。
首先,須要使用isInstanceOf判斷對象是不是指定類的對象,若是是的話,則可使用asInstanceOf將對象轉換爲指定類型。
若是對象是null,則isInstanceOf必定返回false,asInstanceOf必定給返回null。
若是沒有isInstanceOf先判斷對象是否爲指定類的實例,就直接用asInstanceOf轉換,則可能拋出異常。
isInstanceOf只能判斷出對象是不是指定類及其子類的對象,而不能精確判斷出,對象就是指定類的對象。
若是要求精確的判斷對象就是指定類的對象,那麼就只能使用getClass和classOf了。
對象.getClass能夠精確獲取對象的類,classOf[類]能夠精確獲取類,使用==操做便可判斷。
在實際開發中,大量的使用了模式匹配的方式進行類型的判斷,這種方式更加簡潔明瞭,並且代碼可維護性和可擴展性也很是高。
使用模式匹配,功能性上來講,與isInstanceOf同樣,也是判斷主要是該類以及該類的子類的對象便可,不是精準判斷的。
Scala中,可使用protected修飾field和method,這樣在子類中就能夠不須要super關鍵字,直接就能夠訪問field和method。
可使用protected[this],則只能在當前子類對象中訪問父類的field和method,沒法經過其餘子類對象訪問父類的field和method。
Scala中,每一個類能夠有一個主constructor和任意多個輔助constructor,而每一個輔助constructor的第一行都必須是調用其它輔助constructor或者是主constructor,所以子類的輔助constructor是必定不能直接調用父類的constructor的。
只能在子類的主constructor中調用父類的constructor,如下這種語法,就是經過子類的主構造函數來調用父類的構造函數。
若是是父類中接受的參數,好比name和age,子類中接受時,就不要用任何val或var來修飾了,不然會認爲是子類要覆蓋父類的field。
Scala中,匿名子類很是常見,並且很是強大,spark源碼中使用了大量這種匿名內部類。
匿名子類就是說能夠定義一個類的沒有名稱的子類,並直接建立其對象,而後將對象的引用賦予一個變量,以後甚至能夠將該匿名子類的對象傳遞給其餘函數。
若是在父類中,某些方法沒法當即實現,而須要依賴不一樣的子類來覆蓋,重寫實現本身不一樣的方法實現。此時能夠將父類中的這些方法不給出具體的實現,只有方法簽名,這種方法就是抽象方法。
若是一個類中有一個抽象方法,那麼類就必須用abstract來聲明爲抽象類,此時抽象類是不能夠實例化的。
在子類中覆蓋抽象類的抽象方法時,不須要使用override關鍵字。
若是在父類中,定義了fiield,可是沒有給出初始值,則此field爲抽象field。
抽象field意味着,scala會根據本身的規則,爲var或val類型的field生成對應的getter和setter方法,可是父類中是沒有該field的。
子類必須覆蓋field,以定義本身的具體field,而且覆蓋抽象field,不須要使用override關鍵字。