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

原文地址:https://www.cnblogs.com/AK47Sonic/p/7349080.html