• 快学Scala 第十二课 (抽象类, 抽象字段, 提前定义)


    抽象类:

    Scala 抽象类中,抽象方法不需要使用abstract。

    在子类中重写超类抽象方法时,不需要使用override。

    abstract class Person {
      
      def say(s: String): Unit
    }
    

    抽象字段:

    使用匿名类型定制抽象字段:

     提前定义:

    class Creature {
      val range: Int = 10
      val env: Array[Int] = new Array[Int] (range)
    }
    
    
    class Ant extends Creature {
     override val range = 2
    }
    
    val ant = new Ant
    println(ant.env.length)
    

    以上程序的运行结果不是10,也不是2, 却是0. 是不是很神奇???

    发生了什么:

    1. Ant的构造器在做自己的构造器之前,调用Creature的构造器。

    2. Creature的构造器将它的range字段设为10。

    3. Creature的构造器为了初始化env数组, 调用range()。

    4. 该方法被重写,但range字段还未被初始化,所以返回0。

    5. env被设置为长度0的数组。

    6. Ant构造器执行,将range字段设置为2。

    为了解决构造顺序问题,使用提前定义,让超类的构造器执行之前初始化子类字段。

    class Creature {
      val range: Int = 10
      val env: Array[Int] = new Array[Int] (range)
    }
    
    class Ant extends {
      override val range = 2
    } with Creature {
    
    }
    
    val ant = new Ant
    println(ant.env.length)
    

    运行结果:

    2

  • 相关阅读:
    linux下音乐播放软件
    老男孩教育Python自动化开发精英班-开班典礼感想
    【热身】github的使用
    ubuntu12.04下有线网无电缆插入问题
    ubuntu12.04下安装搜狗拼音
    对树莓派学习开发环境的探讨
    Ubuntu12.04下安装VirtualBox
    ubuntu下安装显卡驱动
    ubuntu下使用锐捷校园网
    深度学习之优化算法
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7349080.html
Copyright © 2020-2023  润新知