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

mac2022-06-30  69

抽象类:

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

最新回复(0)