版權聲明:本文為半吊子子全棧工匠(wireless_com,同公衆号)原創文章,未經允許不得轉載。 https://blog.csdn.net/wireless_com/article/details/42322455
scala擴充類的方式同樣是使用extends關鍵字,重寫一個非抽象方法必須使用override修飾符,用isInstanceOf方法判斷某個對象是否屬于某個特定的類,隻有主構造器可以調用超類的構造器。
字段重寫時的限制:
-def 隻能重寫另一個def
-val隻能重寫另一個val或不帶參數的def
-var隻能重寫另一個抽象的var
構造順序問題的根本原因——java允許在超類的構造方法中調用子類的方法。因為在子類中正确的擴充相等性判斷非常困難,是以将equals方法定義成final。除非萬不得已,不要使用wait,notify和synchronized。
和java的接口不同,scala特質可以給出這些特質的預設實作。讓特質擁有具體行為存在一個弊端,當特質改變時,所有混入了該特質的類必須要重新編譯。scala不支援多繼承,可以用with關鍵字來添加額外的特質。當做富接口使用的特質将具體方法和抽象方法結合在了一起,特質中的字段同樣既可以是具體的,又可以是抽象的。
混入特質的對象在構造時的執行順序:
1)首先調用超類的構造器
2)特質構造器在超類構造器之後,類構造器之前執行
3)特質由左到右構造
4)每個特質中,父特質先被構造,
5)如果多個特質有一個父特質,若已被構造則不會再次構造
6)所有特質構造完畢,子類被構造。
缺少構造器參數是特質與類之間唯一的技術差别。