scala 继承 多态 构造器执行顺序

57 阅读2分钟

一. 继承 多态

package dsj03

object class03 {
class Fruit() {
  def eat():Unit= {
  /**
  面向对象编程中的继承和多态特性,具体来说:
代码中定义了父类 `Fruit`(水果),以及两个子类 `Watermelon`(西瓜)和 `Apple`(苹果),子类通过 `extends` 关键字继承父类
*/
    println("吃掉果皮 中间的不能吃")
  }
}
  class Watermelon extends Fruit {
    override def eat(): Unit = { // override:方法重写
      println("削皮 中间的好吃")
    }
  }

  def main(args: Array[String]): Unit = {
    //参数类型 父类
    /`test` 方法参数类型为父类 `Fruit`,但实际调用时传入的是子类对象(`Apple` 或 `Watermelon`)
    def test(fruit: Fruit):Unit = {
      fruit.eat()
    }

    class Apple extends Fruit {
      override def eat(): Unit = {
        println("洗干净 直接吃")
      }
    }
    val a1 = new Apple()
    test(a1)//传入子类

    val w1 = new Watermelon()
    test(w1)
  }
}

二.构造器

package dsj03

// 这段代码展示的是面向对象编程中继承关系下的构造器执行顺序,具体说明如下:
// 核心逻辑:子类对象创建时,父类构造器先执行
// 代码中定义了父类 Father 和子类 Son(Son extends Father 表示继承关系)
// 当在 main 方法中创建子类 Son 的对象(new Son())时,程序的执行顺序是
// 先执行父类 Father 的构造器(打印 Fater 的构造器...)
// 再执行子类 Son 的构造器(打印 Son 的构造器...)

object class04 {
  class Father() {
    println("Fater 的构造器...")
  }

  class Son extends Father(){
    println("Son 的构造器...")
  }

  def main(args: Array[String]): Unit = {
    //创建一个子类的对象时
    //先调用父类的构造器 →子类的构造器
    new Son()
  }
}
package dsj03

object class05 {
//父类
  class Animal (var name:String,var age:Int) {
  println(s"父类的构造器被调用...${name},${age}")
  def say():Unit = {
    println(s"Animal ${name},${age}")
  }
}

  //子类
  class Dog(name:String,age:Int,var 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.png