zoukankan      html  css  js  c++  java
  • 快学Scala(8)--继承

    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) {
    }
    

      输出:

  • 相关阅读:
    注解
    idea 快速生成返回值快捷方式
    异常处理
    finally 关键字
    博客园美化
    winform中webBrowser模拟网页操作中遇到的问题
    使用NPOI 2.1.1读取EXCEL2003/2007返回DataTable
    使用事务和SqlBulkCopy批量插入数据
    Java String比较
    Java 实例级别的锁和类级别的锁
  • 原文地址:https://www.cnblogs.com/PaulingZhou/p/6625840.html
Copyright © 2011-2022 走看看