抽象类:
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