近來學習scala,在繼承這一塊有一點小小的發現,遂記錄下來,以備以後複習之用。
1,當with放在子類定義的後面時,輸出的結果為:300和150
class Animal {
val weight = 100
val doubleWeight = 2 * weight
}
class Tiger extends {
override val weight: Int = 150
} with Animal
object OverridField {
def main(args:Array[String]): Unit ={
val tiger = new Tiger
println(tiger.doubleWeight) // 300
println(tiger.weight) //150
}
}
2,當去掉with用子類直接繼承父類時,輸出的結果卻變成了:0和150
class Animal {
val weight = 100
val doubleWeight = 2 * weight
}
class Tiger extends Animal{
override val weight: Int = 150
}
object OverridField {
def main(args:Array[String]): Unit ={
val tiger = new Tiger
println(tiger.doubleWeight) // 0
println(tiger.weight) // 150
}
}
3、當子類裡面的重寫父類的方法去掉時,無論是否有with輸出的結果都是:200和100
class Animal {
val weight = 100
val doubleWeight = 2 * weight
}
class Tiger extends Animal{
// override val weight: Int = 150
}
object OverridField {
def main(args:Array[String]): Unit ={
val tiger = new Tiger
println(tiger.doubleWeight) // 200
println(tiger.weight) // 100
}
}
為什麼都是繼承,結果會有這麼大的差異呢?
通過Debug發現:
第一種情況,with在子類定義完之後,先執行子類再執行父類,這時父類中的方法會自動接收覆寫後的屬性即weight為150,doubleWeight為300;
第二種情況在沒有with的情況下,會先執行父類,這時因為子類override的存在weight還會用覆寫的值,但此時後沒有經過子類進行覆寫指派,預設weight為0,是以doubleWeight為0,等父類執行完成後在執行子類,是以最後weight為150;
第三種情況,因為子類中沒有對父類進行覆寫及其它操作,是以最後都是父類的值,即weight為100,doubleWeight為200。
以上純屬個人淺見,如有問題或不對的地方歡迎留言。