• 快学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

  • 相关阅读:
    oracle常用hint的用法
    浅谈reverse函数与django哲学
    javascript console
    python os.path模块
    删除列表元素
    Python模块学习 pickle, cPickle 对象序列化/反序列化
    Python中zip()函数用法举例
    Python 字符串方法详解
    常用正则验证
    python中下划线的用法
  • 原文地址:https://www.cnblogs.com/AK47Sonic/p/7349080.html
Copyright © 2020-2023  润新知