天天看點

scala 繼承extends,with淺見

近來學習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。

以上純屬個人淺見,如有問題或不對的地方歡迎留言。