scala中继承(父子级)

35 阅读3分钟

前面我们学习了Scala中类的相关知识,主要是一个类和一个对象,接下来一段时间,我们将学习多个类之间的关系。今天先来看两个类之间的继承关系。

(一)继承的概念和基本语法

  • 定义:在原有类的基础上定义一个新类,原有类称为父类,新类称为子类。

  • class 子类名 extends 父类名 { 类体 }

  • 好处:复用代码和实现多态。复用代码:子类可以继承父类的特性。多态 子类可以在自己内部实现父类没有的特性。

eg1:

package level02

import java.io.FileWriter

object basss124 {


     object cl
     /*
     *继承
     * extends
     * 好处:不劳而获
     *
     */

     class Animal() {
          def eating():Unit ={
               println("Animal eating")
          }
     }
     //Dog继承了 Animal

  class Dog extends Animal (){

  }

     def main(args: Array[String]): Unit = {
         val dog1 =new Dog()
         dog1.eating()//直接可以使用父类的方法

     }


}

当子类从父类继承的方法不能满足需要时,子类需要有自己的行为,怎么办?此时使用使用 override 可以重写父类的方法

(二) override

格式:override def 方法名(参数可选) { }

eg2:

package level02

import java.io.FileWriter

object basss124 {


     object cl
     /*
     *继承
     * extends
     * 好处:不劳而获
     *
     * 问题:
     * 如果子类觉得父类的方法并不是自己想要的,如何定义自己的方法呢? 
     * 1.override重写
     * 2.super 在子类内部,通过super 来访问父类
     */

     class Animal() {
          def run():Unit={
               
          }
          def eating():Unit ={
               println("Animal eating")
          }
     }
     //Dog继承了 Animal

  class Dog extends Animal (){
     //在子类中重写(覆盖)父类的方法
       override  def eating():Unit ={
            //调用父类的方法?
            //在子类内部,通过super 来访问父类
            super.eating()
            println("我是狗,我有自己的吃饭方式!!")
       }
  }

     def main(args: Array[String]): Unit = {
         val dog1 =new Dog()
         dog1.eating()//调用自己的吃饭方法!

     }


}

(三)继承与多态

  • 面向对象的三个特点:_封装  继承 多态
  • 同一操作作用于不同的对象, 可以有不同的解释,产生不同的执行结果,这就是多态性。

eg3:

package level02

object basss125 {
     /*
     *面向对象的编程语言有三大特性: 封装,继承,多态
   *多态:同一个操作,作用于不同的对象,有不同的执行结果。
     */

     class Animal() {
          def eating():Unit ={
               println("Animal eating")
          }
     }
     //Dog继承了 Animal

  class Dog extends Animal (){

       override  def eating():Unit ={

            super.eating()
            println("我是狗,我要大口大口的嚼!!")
       }
  }
  //cat继承了 Animal

  class Cat extends Animal (){

    override  def eating():Unit ={

      super.eating()
      println("我是猫,我要小口小口的吃!!")
    }
  }
//测试函数
  //他的参数类型是父亲

        def test(animal: Animal):Unit ={
          animal.eating()
        }
     def main(args:Array[String]):Unit={
       val cat=new Cat()
       val dog =new Dog()
       test(cat)
       test(dog)

     }
}

当我们实例化子类的对象时,是否需要调用父类的构造器? 是否需要调用子类的构造器?

(四) 处理构造器的调用顺序

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

eg4:

package level02

object basss126 {
     /*
     *存在继承关系的时候,构造器的调用顺序
     * 父类构造器 -》 子类构造器

     */

     class Animal() {
       println("父类构造器被调用....")

     }
     //Dog继承了 Animal

  class Dog extends Animal (){

    println("子类构造器被调用....")
       }



  //Puppy 继承了Dog
  class Puppy extends  Dog(){
    println("子类:Puppy 构造器被调用....")

  }

  def main(args: Array[String]): Unit = {
    new Puppy();//new会自动调用构造器去生成对象
  }

}
  • 完结撒花 !!!!!!!!!!
  • 制作不易 希望·一键三连 在此感谢关注的粉丝宝宝
  • 新来的宝宝可以关注下主播哟!!!!!