快学Scala(8)--继承

Posted on 2017-03-27 16:34  paulingzhou  阅读(138)  评论(0编辑  收藏  举报
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) {
}

  输出: