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。

以上纯属个人浅见,如有问题或不对的地方欢迎留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值