处理构造器的调用顺序

42 阅读1分钟

代码验证调用顺序:父类的主构造器->子类主构造器->子类的辅助构造器

package level02

object class14 {
  /**
   * 子类对父类的方法 重写
   * 在子类中,通过override覆盖(重写)父类的同名方法
   * super:在子类中访问父类
   * 面向对象编程的三大特征;封装--继承--多态--
   * 构造器的调用顺序:先调用父类的,再调用子类的
   * 当父类,子类都存在带参数的构造器的时候,如何进行参数传递?
   */
  class Animal(val name:String,val age: Int){
    println(s"父类的构造器被调用...${name},${age}")
    def say(): Unit = {
      println(s"Animal ${name},${age}")
    }
  }

  //子类
  class Dog(name: String, age: Int, val color: String) extends Animal(name,age) {
    println(s"子类的构造器被调用...${name},${age},${color}")
    override def say(): Unit = {
      super.say()
      println(s"狗狗...,我的颜色是${color}")
    }
  }
    def main(args: Array[String]): Unit = {
      val d1 = new Dog("旺财", 1, "黑色")
      d1.say()
    }
  }

1. class Dog()中,参数不需要添加var或者val。因为它继承Animal,所以它本身就有name,age属性。如果添加了var,就说明你需要name成为Dog类的属性,但是,由于继承的关系,它本身就是了,所以不需要。

2. Animal(name,age) 中, name, age的前面都没有添加修饰符。在子类构造函数调用的时候,就会执行这个函数,并进行参数传递。