代码验证调用顺序:父类的主构造器->子类主构造器->子类的辅助构造器
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的前面都没有添加修饰符。在子类构造函数调用的时候,就会执行这个函数,并进行参数传递。