if(p.isInstanceOf[Employee]) { val s = p.asInstanceOf[Employee] //s的类型为Employee }
如果p指向的是Employee及其子类的对象,则o.isInstanceOf[Employee]将会成功;
如果p是null,则p.isInstanceOf[Employee]将会返回false,且p.asInstanceOf[Employee]将会返回null
如果p不是一个Employee,则p.asInstanceOf[Employee]将抛出异常
如果想测试p指向的是一个Employee对象但又不是其子类的话,可以用:
if(p.getClass == classOf[Employee])
不过,与类型检查和转换相比,模式匹配通常是更好的选择:
p match { case s: Employee => ... //将s作为Employee处理
case _ => //p不是Employee
}
超类的构造:
class Employee(name: String, age: Int, val salary: Double) extends Person(name, age)
提前定义:
class Creature { val: range: Int = 10
val env: Array[Int] = new Array[Int](range)
}
class Ant extends Creature {
overide val range = 2
}
当构造Ant类的对象时事情发生的过程如下所示:
1. Ant的构造器在做它自己的构造之前,调用Creature的构造器
2. Creature的构造器将它的range字段设为10
3. Creature 的构造器为了初始化env数组,调用range()取值器
4. 该方法被重写以输出(还未初始化的)Ant类的range字段值
5. range方法返回0
6. env被设为长度为0的数组
7. Ant构造器继续执行,将其range字段设置为2
此时若输出Ant类的对象的range属性和env属性的长度结果如下图:
上述Scala代码反编译为Java代码后为:
public class Creature { public int range() { return this.range; } private final int range = 10; public int[] env() { return this.env; } private final int[] env = new int[range()]; }
public class Ant extends Creature { public int range() { return this.range; } private final int range = 2; }
在这种情况下,env数组长度正常:
class Creature(var range: Int = 10) { val env: Array[Int] = new Array[Int](range) } class Ant extends Creature(range = 5) { }
输出: